FileIO.ReadTextAsync偶尔挂起(FileIO.ReadTextAsync occa

2019-06-25 08:19发布

我只是用WinRT的实验和一个演示应用程序我创建是加载/保存到本地存储基本的“记事本”风格的应用程序。 虽然我熟悉正确的async构建WinRT的应用程序的方法,我的演示应用程序是使用同步Load让事情变得简单。

的问题是,当一个呼叫是由于Load ,它的工作原理2出3倍和应用上的呼叫挂起其余时间var result = await FileIO.ReadTextAsync(storageFile);

public class ContentStorage : IContentStorage
{
    private const string FileName = "contents.txt";

    public string Load()
    {
        return LoadAsync().Result;
    }

    public void Save(string content)
    {
        SaveAsync(content);
    }

    private static async Task<string> LoadAsync()
    {
        var storageFile = await LocalFolder.GetFileAsync(FileName);
        var result = await FileIO.ReadTextAsync(storageFile);

        return result;
    }

    private static async void SaveAsync(string content)
    {
        var storageFile = await LocalFolder.CreateFileAsync(FileName, CreationCollisionOption.ReplaceExisting);

        FileIO.WriteTextAsync(storageFile, content);
    }

    private static StorageFolder LocalFolder
    {
        get { return ApplicationData.Current.LocalFolder; }
    }
}

我做事情非常愚蠢的吗?

FWIW,我尝试了改变Load只是明确各工序模块,这提高了吊至1比20,但我还是不明白为什么它挂在所有...

public string Load()
{
    var storageFile = LocalFolder.GetFileAsync(FileName).AsTask().Result;
    var result = FileIO.ReadTextAsync(storageFile).AsTask().Result;

    return result;
}

Answer 1:

虽然我熟悉正确的async构建WinRT的应用程序的方法,我的演示应用程序是使用同步Load让事情变得简单。

并不是的。 混合同步异步代码是极其复杂的。 这是简单得多,只需使用async无处不在。

当一个async方法等待任务后继续执行,默认情况下将恢复到原来的环境。 (我更详细的我管这个async / await博客文章 )。 某些情况下(如UI上下文)只允许一个线程; 如果该线程被阻塞(例如,在Task.Result ),则async方法不能进入该上下文来完成它的执行。 这将导致死锁。

欲获得更多信息:

  • async / await FAQ对上下文捕获和恢复了很多细节。
  • 关于并行团队博客斯蒂芬Toub有另一篇博客中等待,并且UI,和死锁! 天啊! ,其中详细解释了这个特殊的死锁情况。
  • 我写了一个详尽的答案对于这种僵局的一个MSDN论坛上发帖 。

它实际上是由微软demo'd这种僵局是不够有名:

  • 通过在BUILD大会斯蒂芬Toub(2011年9月16日)。
  • 通过卢西恩Wischik在DevConnections(2012年3月26日)。


Answer 2:

尝试使用ConfigureAwait(false用的await操作),可能是ReadTextAsync不是线程安全的,所以它会挂在UI线程时,伺机完成并返回到UI线程。



文章来源: FileIO.ReadTextAsync occasionally hangs