我一直在解决这个问题,但现在我真的想了解出了什么问题.我有一个相当简单的应用程序(它是youtrack的turtoise SVN插件,但我可以用一个简单的winforms应用程序重现这个问题).
我有一个异步方法 ResolveIssue
public async TaskResolveIssue(Issue issue, int revision, string[] pathList) { await Task.Delay(1000); return true; }
创建死锁所需要做的就是在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! }
现在我明白拥有异步方法并主动等待它是相当奇怪的,但为什么会产生死锁?!