Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步方法赢得';呼叫时不返回_C#_Asynchronous_File Io_Windows Phone 8.1_Win Universal App - Fatal编程技术网

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)
的情况下尝试过该方法?您如何调用此方法?