gpt4 book ai didi

c# - FileIO.ReadTextAsync 偶尔挂起

转载 作者:行者123 更新时间:2023-12-02 05:43:02 25 4
gpt4 key购买 nike

我只是在尝试使用 WinRT,我正在创建的一个演示应用程序是一个基本的“记事本”风格的应用程序,它可以加载/保存到本地存储。虽然我熟悉构建 WinRT 应用程序的正确async 方法,但我的演示应用程序使用同步Load 来简化操作。

问题是,当调用 Load 时,它会工作 3 次中的 2 次,其余时间应用程序挂起调用 var result = await FileIO。 ReadTextAsync(存储文件);

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 更改为明确地阻止每一步,这将挂起率提高到 20 分之一,但我仍然不明白为什么它会挂起...

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

return result;
}

最佳答案

Whilst I'm familiar with the proper async approach for building WinRT apps, my demo app is using a synchronous Load to keep things simple.

不是真的。将同步代码与异步代码混合在一起非常复杂。在任何地方都使用 async 要简单得多。

async 方法在等待任务后继续执行时,默认情况下它将返回到其原始上下文。 (我在 async/await blog post 中对此进行了更详细的介绍)。一些上下文(例如 UI 上下文)只允许一个线程;如果该线程被阻塞(例如,在 Task.Result 上),则 async 方法无法进入该上下文以完成其执行。这会导致死锁。

更多信息:

这个死锁非常有名,微软已经对其进行了演示:

关于c# - FileIO.ReadTextAsync 偶尔挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10700570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com