2013-08-30 74 views
5

Tôi đã đọc lên một chút trên async/await và đang cố gắng tạo lại kịch bản bế tắc trong các cửa sổ bằng cách gọi WebClient.DownloadStringTaskAsync trên chuỗi giao diện người dùng và sau đó gọi task.Result trên chuỗi giao diện người dùng trong khi tác vụ đang thực thi . Điều này dẫn đến một bế tắc.ConfigureAwait (false) vẫn là deadlocks

Sau đó, tôi đã cố gắng giải quyết vấn đề bằng cách gọi ConfigureAwait(false) trên tác vụ được trả lại, nhưng với sự ngạc nhiên của tôi vẫn gây ra bế tắc. Sự hiểu biết của tôi là nó nên thực hiện việc tiếp tục của phương pháp trên một chủ đề khác nhau và do đó không nên có bế tắc. Tôi đang thiếu gì?

Tôi biết cách giải quyết vấn đề nhưng suy nghĩ ConfigureAwait(false) cũng sẽ khắc phục sự cố.

Đây là đoạn mã, tôi đang sử dụng 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; 
    } 

Trả lời

10

WebClient vẫn sẽ gây ra bế tắc này vì DownloadStringTaskAsync chỉ là một wrapper quanh EAP phương pháp, mà luôn nâng cao sự kiện của họ trong bối cảnh ban đầu. Không có cách nào để tắt chức năng này.

Hãy thử sử dụng HttpClient (hoặc một cái gì đó đơn giản như Task.Delay) để xem sự khác biệt.