我有一个NuGet包Esri.ArcGISRuntime,我需要在我的Web API 2控制器中调用方法QueryTask.ExecuteAsync。由于没有同步的对应方法,在我的C#库代码中,我使用了一个类似的封装器。
private QueryResult ExecuteSync()
{
var queryResults = ExecuteAsync();
queryResults.Wait();
return queryResults.Result;
}
private async Task<QueryResult> ExecuteQueryTaskAsync()
{
var queryTask = new QueryTask(_uri);
return await queryTask.ExecuteAsync(_query).ConfigureAwait(false);
}
这在我的程序/服务中运行得非常完美。但是在Web API 2控制器中使用ExecuteSync
会导致它完全冻结并永远不会返回响应。
我进行了一些研究,并认为罪魁祸首在这里提到: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
我绝对不想异步使用此功能。上述函数是如此核心且深藏在4个包装器中,以至于为了支持此Web API调用而将异步方法向上冒泡将是库类的重大改进。
我正在寻找解决此奇怪行为的变通方法/技巧/建议,以允许我同步运行此异步方法而不会死锁。
await
,阅读这篇文章。 - LegendsConfigureAwait(false)
... 代码不应该死锁(所以我改了标题并删除了错误的重复)- 最好查看线程在死锁发生时被卡住的位置。同时尝试非常基本的异步方法(Task.Delay(1000)
),以确认问题与库无关。 - Alexei Levenkov