异步方法获胜';调用时不会返回
本文关键字:返回 调用 获胜 异步方法 | 更新日期: 2023-09-27 18:24:57
我在这方面遇到了麻烦。我正在尝试制作一个异步方法,将本地文件的内容作为字符串返回。这是我的方法:
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
。这可能会导致我在博客中描述的死锁。
总之,当await
用于任务时,默认情况下它将捕获当前"上下文",并使用该上下文来恢复async
方法。在这种情况下,上下文是与单个UI线程关联的UI上下文。如果调用堆栈上的代码正在调用Wait
或Result
,那么它会阻塞UI线程,从而阻止async
方法完成。
您的方法正在正常工作。我怀疑您在调试时遇到了这个问题。
我也注意到(有时)在调试asyc方法时有这样的行为(这里有一个问题的链接)-程序从不从该方法返回,只是挂起-我不知道确切的原因。要测试它,只需尝试像这样运行您的方法-例如,点击按钮:
private async void firstBtn_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Before method");
string readValue = await ReadContentsAsString("TextFile1.txt");
Debug.WriteLine(string.Format("Read value: {0}", readValue));
}
正如我在设备上测试的那样,它应该可以工作,但如果我在方法中设置了断点,它就会挂起。