【发布时间】:2012-07-14 02:06:41
【问题描述】:
我试图在应用程序启动时加载和读取设置文件,大约 90% 的时间,await GetFileAsync("filename.xml"); 永远不会返回,因此会挂起应用程序。
大约四分之一的时间,如果我单步执行代码,它实际上会返回并读取文件。
这是一个非常简化的代码版本:
App.xaml.cs:
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
FileLoader.Load().Wait();
// File-load dependent stuff
}
FileLoader.cs:
public async static Task Load()
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file;
bool fileExists = true;
try
{
// The following line (often) never returns
file = await folder.GetFileAsync("filename.xml");
{
catch
{
fileExists = false;
}
// Do stuff with loaded file
}
如果我在 Visual Studio 中观看“输出”窗口,等待一段时间后我会收到 "The thread '<No Name>' (0x30c) has exited with code 0 (0x0)."
有人知道这里发生了什么吗?
【问题讨论】:
-
在调用
Wait时,您正在阻塞 UI 线程。这真是个坏主意。哎呀,这甚至可能是导致问题的原因。 -
我认为 Jon 是完全正确的 - 你有没有机会将 OnLaunched 标记为异步然后等待 Load() 调用?如果不能,那么另一种方法可能是让 Load 在加载完成后执行一个操作,然后在最后运行该操作(或者,当然,您可以在 Load() 返回的任务上使用 ContinueWith就像你在 async/await 之前所做的一样 :)
-
你说得对,乔恩和詹姆斯。非常感谢您的意见!我最初使用
Wait是因为我没有意识到您可以将async添加到覆盖的方法中,而且我不知道OnLaunched正在UI 线程上运行。删除Wait并将async添加到OnLaunched修复了它!我希望我可以将您的 cmets 标记为答案。
标签: c# file-io windows-8 windows-runtime async-await