Я столкнулся с некоторыми передовыми методами асинхронного программирования с использованием ключевых слов async/await С# (я новичок в С# 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<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
Если я попытаюсь сам ее вскрыть, основной поток появится в новом "MyWebService.GetDataAsync();", но поскольку главный поток ожидает там, он ждет результата в "GetDataAsync(). Результат", Между тем, скажем, данные готовы. Почему основной поток не продолжает эту логику продолжения и возвращает результат строки из GetDataAsync()?
Может кто-нибудь объяснить мне, почему в приведенном выше примере есть тупик? Я совершенно не знаю, в чем проблема...