2013-08-30 4 views
5

Я читал немного о async/await и пытаюсь воспроизвести сценарий взаимоблокировки в окне формы, вызвав WebClient.DownloadStringTaskAsync в потоке пользовательского интерфейса, а затем вызвать task.Result в потоке пользовательского интерфейса, а задача выполнения , Это привело к тупиковой ситуации.ConfigureAwait (ложь) до сих пор ТУПИКОВ

Затем я попытался решить проблему, вызвав 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; 
    } 

ответ

10

WebClient будет по-прежнему вызывает эту тупиковую ситуацию, потому что DownloadStringTaskAsync просто обертка вокруг EAP методов, которые всегда поднять свое мероприятие в оригинальном контексте. Невозможно отключить это.

Попробуйте использовать HttpClient (или что-то простое, например Task.Delay), чтобы увидеть разницу.

Смежные вопросы