3

我对此有不好的时间。我试图做一个异步方法,返回一个本地文件的内容作为字符串。这是我的做法:异步方法调用时不会返回

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)

我错过了什么?

+1

您是否尝试过没有'.AsTask()。ConfigureAwait(false)'? – 2014-09-28 21:24:23

+4

你是怎么称呼这个方法的? – 2014-09-28 21:25:56

回答

4

我怀疑进一步调高您的呼叫堆栈,您的代码有拨打Task.WaitTask<T>.Result。这可能会导致deadlock that I describe on my blog

总之,当一个任务使用await时,默认情况下它会捕获当前的“上下文”并使用该上下文恢复方法。在这种情况下,上下文是与单个UI线程关联的UI上下文。如果进一步调用堆栈的代码是调用WaitResult,那么它会阻塞UI线程,从而阻止完成方法。

2

您的方法正常工作。我怀疑你在调试时遇到了这个问题。

我也注意到(有时)这样的行为调试ASYC时方法(here is a link的问题) - 该程序不会从该方法返回和只是挂起 - 我不知道这个确切的原因。为了测试它只是尝试运行你的方法是这样 - 在按一下按钮,例如:

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)); 
} 

正如我在设备上进行测试 - 它应该工作,但如果我把你方法中的断点 - 这将挂起。