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

正如我在設備上進行測試 - 它應該工作,但如果我把你方法中的斷點 - 這將掛起。