簡體   English   中英

調用時,異步方法不會返回

[英]Async method won't return when called

我對此感到非常糟糕。 我正在嘗試創建一個異步方法,將本地文件的內容作為字符串返回。 這是我的方法:

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.WaitTask<T>.Result 這可能導致我在博客上描述死鎖

總之,當await用於任務時,默認情況下它將捕獲當前的“上下文”並使用該上下文來恢復async方法。 在這種情況下,上下文是UI上下文,它與單個UI線程相關聯。 如果調用堆棧中的代碼進一步調用WaitResult ,那么它將阻止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));
}

正如我在設備上測試過 - 它應該可以工作,但如果我在你的方法中設置一個斷點 - 它會掛起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM