我在这方面遇到了麻烦。我正在尝试制作一个异步方法,将本地文件的内容作为字符串返回。这是我的方法:
private static async Task<string> ReadContentsAsString(string fileName)
{
var uri = new Uri(string.Format(@"ms-appx:///{0}", fileName));
var file = await StorageFile.GetFileFromApplicationUriAsync(uri).AsTask().ConfigureAwait(false);
var stream = await file.OpenStreamForReadAsync().ConfigureAwait(false);
using (var streamReader = new StreamReader(stream))
{
return await streamReader.ReadToEndAsync();
}
}
不幸的是,在执行到我的方法结束后,应用程序会永远等待。它完全挂起。它在最开始被调用,当启动画面仍然显示时(Windows Phone 8.1)
我错过了什么?
最佳答案
我怀疑在您的调用堆栈的更上方,您的代码调用了 Task.Wait
或 Task<T>.Result
.这可能会导致 deadlock that I describe on my blog .
总而言之,当 await
用于任务,默认情况下它将捕获当前“上下文”并使用该上下文恢复 async
方法。在这种情况下,上下文是 UI 上下文,它与单个 UI 线程相关联。如果代码更上层,调用堆栈正在调用 Wait
或 Result
,然后它会阻塞 UI 线程,从而阻止 async
整理方法。
关于c# - 异步方法在调用时不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26089740/