Я некоторое время работал над этой проблемой, но теперь мне очень хотелось бы понять, что пошло не так. У меня довольно простое приложение (это тупик SVN-плагина для youtrack, но я могу воспроизвести проблему с помощью тривиального приложения winforms).
У меня есть асинхронный метод ResolveIssue
public async Task<bool> ResolveIssue(Issue issue, int revision, string[] pathList)
{
await Task.Delay(1000);
return true;
}
Все, что мне нужно сделать для создания тупика, вызывает этот метод async в обработчике событий Button
и вызывает Task.Wait
или Task.Result
, как этот
private void buttonOk_Click(object sender, System.EventArgs e)
{
var asyncResolvedIssue = api.ResolveIssue(issue, revision, pathList);
if (asyncResolvedIssue.Result) {} // <== deadlock!
}
Теперь я понимаю, что довольно странно иметь асинхронный метод и активно ждать его, но почему он генерирует тупик?!