簡體   English   中英

ConfigureAwait(false)仍然是死鎖

[英]ConfigureAwait(false) still deadlocks

我一直在閱讀async/await ,並試圖通過在UI線程上調用WebClient.DownloadStringTaskAsync然后在任務執行時調用UI線程上的task.Result來重現Windows窗體中的死鎖場景。 這導致了僵局。

然后我嘗試通過在返回的任務上調用ConfigureAwait(false)來解決該問題,但令我驚訝的是仍然導致死鎖。 我的理解是它應該在不同的線程上執行方法的延續,因此不應該有死鎖。 我錯過了什么?

我知道如何解決這個問題但是認為ConfigureAwait(false)也會修復它。

這是代碼,我使用的是.NET 4.5

    private async void button1_Click(object sender, EventArgs e)
    {
        // Deadlocks!
        Task<string> task = DownloadAsync();
        textBox1.Text = task.Result;

        // Works
        //textBox1.Text = await DownloadAsync();
    }

    private static async Task<string> DownloadAsync()
    {
        var client = new WebClient();

        string result = await client.DownloadStringTaskAsync("http://www.rpmglobal.com").ConfigureAwait(false);          

        return result;
    }

WebClient仍會導致此死鎖,因為DownloadStringTaskAsync只是EAP方法的包裝器,它總是在原始上下文中引發它們的事件。 沒有辦法把它關掉。

嘗試使用HttpClient (或類似Task.Delay類的Task.Delay )來查看差異。

暫無
暫無

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

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