C# 异步方法赢得';呼叫时不返回
这件事让我很难过。我试图创建一个异步方法,以字符串形式返回本地文件的内容。这是我的方法:C# 异步方法赢得';呼叫时不返回,c#,asynchronous,file-io,windows-phone-8.1,win-universal-app,C#,Asynchronous,File Io,Windows Phone 8.1,Win Universal App,这件事让我很难过。我试图创建一个异步方法,以字符串形式返回本地文件的内容。这是我的方法: private static async Task<string> ReadContentsAsString(string fileName) { var uri = new Uri(string.Format(@"ms-appx:///{0}", fileName)); var file = await StorageFile.GetFileFromApplicationUri
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();
}
}
private静态异步任务ReadContentsAsString(字符串文件名)
{
var uri=新的uri(string.Format(@“ms appx://{0}”,文件名));
var file=await-StorageFile.getfilefromApplicationUrisync(uri).AsTask().ConfigureAwait(false);
var stream=await file.OpenStreamForReadAsync().ConfigureAwait(false);
使用(var streamReader=新streamReader(stream))
{
返回wait wait streamReader.ReadToEndAsync();
}
}
不幸的是,在执行到我的方法结束后,应用程序将永远等待。它完全挂起来了。当启动屏幕仍然显示时(Windows Phone 8.1),它在一开始就被调用
我错过了什么?您的方法正常工作。我怀疑您在调试时遇到了这个问题 我在调试asyc方法时也注意到(有时)这样的行为(对于这个问题)——程序从未从该方法返回,只是挂起——我不知道确切的原因。要测试它,请尝试像这样运行您的方法-例如,在单击按钮时:
private async void firstBtn\u单击(对象发送方,路由目标)
{
Debug.WriteLine(“方法之前”);
string readValue=等待readContentsString(“TextFile1.txt”);
WriteLine(string.Format(“读取值:{0}”,readValue));
}
正如我在设备上测试过的,它应该可以工作,但如果我在方法中设置了断点,它将挂起。我怀疑在调用堆栈的后面,您的代码调用了
任务。等待或任务。结果。这可能会导致严重的后果
总之,当在任务上使用await
时,默认情况下它将捕获当前“上下文”,并使用该上下文恢复async
方法。在本例中,上下文是与单个UI线程关联的UI上下文。如果调用堆栈上的代码正在调用Wait
或Result
,那么它将阻塞UI线程,从而阻止async
方法完成。您是否在没有.AsTask().ConfigureAwait(false)
的情况下尝试过该方法?您如何调用此方法?