使用async/await的文件IO会导致超时和InvalidOperationException

本文关键字:超时 InvalidOperationException IO async await 文件 使用 | 更新日期: 2023-09-27 17:55:03

这是我在这个网站上的第一篇文章,为了让我的代码正常工作,我进行了广泛的搜索。正如标题所说,这是一个WinRT应用程序,我在文件IO上遇到了困难。我想做的是读取存储在应用程序安装目录内的文件夹中的文本文件,该文件夹包含我将提供给List<>的数据行。

public static async void GetStations()
    {
        try
        {
            using (var stream = await Windows.Storage.ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(@"MyApp'Data'file.txt"))
            {
                using (var streamReader = new StreamReader(stream))
                {
                    while (streamReader.Peek() >= 0)
                    {
                        string line = await streamReader.ReadLineAsync();
                        //do something with 
                    }
                }
            }
        }
        catch (Exception e)
        {
            ...
        }
        finally
        {
            ...
        }
    }

问题是我得到的文件没有发现错误时,试图运行它。有人能帮忙吗?如果你需要我发布更多的信息,我可以…

使用async/await的文件IO会导致超时和InvalidOperationException

如果您将文件作为应用程序包的一部分分发,那么Package.Current.InstalledLocation是正确的位置。ApplicationData.Current.LocalFolder只包含应用程序已经放在那里的文件。

正确的代码应该是:

public static async void GetStations()
{
    try
    {
        using (var stream = await Windows.ApplicationModel.Package.Current.InstalledLocation.OpenStreamForReadAsync(@"Data'file.txt"))
        {
            using (var streamReader = new StreamReader(stream))
            {
                while (streamReader.Peek() >= 0)
                {
                    string line = await streamReader.ReadLineAsync();
                    //do something with 
                }
            }
        }
    }
    catch (Exception e)
    {
        //...
    }
    finally
    {
        //...
    }
}

该文件必须包含在您的项目Data文件夹内,并将Build Action设置为Content

与其从ApplicationData打开,您可能需要:

Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync

这将获得包的安装文件夹中的文件,而不是Application的Data文件夹。