Пример асинхронного ожидания / ожидания, который вызывает тупик

Я натолкнулся на некоторые лучшие практики для асинхронного программирования с использованием c # 's /asyncawait ключевые слова (яя новичок в c # 5.0).

Одним из советов было следующее:

Стабильность: знайте свои контексты синхронизации

... Некоторые контексты синхронизации не являются реентерабельными и однопоточными. Это означает, что в данный момент в контексте может быть выполнена только одна единица работы. Примером этого является поток пользовательского интерфейса Windows или контекст запроса ASP.NET. В этих однопоточных контекстах синхронизации этолегко завести себя в тупик. Если вы порождаете задачу из однопоточного контекста, а затем ждите эту задачу в контексте, ваш код ожидания может блокировать фоновую задачу.

public ActionResult ActionAsync()
{
    // DEADLOCK: this blocks on the async task
    var data = GetDataAsync().Result;

    return View(data);
}

private async Task GetDataAsync()
{
    // a very simple async method
    var result = await MyWebService.GetDataAsync();
    return result.ToString();
}

Если я попытаюсь разобрать его сам, основной поток появится в новомMyWebService.GetDataAsync();, но так как главный поток там ждет, он ожидает результата вGetDataAsync().Result, Между тем, говорят, что данные готовы. Почему нетт основной поток продолжитьлогику продолжения и возвращает строковый результат из?GetDataAsync()

Может кто-нибудь объяснить, почему в приведенном выше примере тупик? Я'Я совершенно не знаю, в чем проблема ...

Ответы на вопрос(5)

Ваш ответ на вопрос