【发布时间】:2017-06-21 12:13:17
【问题描述】:
我有 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 调用。
我正在寻找解决 Web API 的这种奇怪行为的变通办法/黑客/建议,以允许我同步运行此异步方法而不会出现死锁
【问题讨论】:
-
你必须使用
await,阅读this -
@AlexeiLevenkov 我假设您的意思是“内部同步上下文”评论,我认为它需要更多内容或成为更多官方答案。该链接并不真正适合我的 web api 控制器示例。仍然不确定该怎么做才能解决
-
嗯,你已经有
ConfigureAwait(false)... 代码不应该死锁(所以我更改了标题并删除了错误的重复项) - 最好查看死锁发生时线程卡在哪里.还可以尝试非常基本的异步方法 (Task.Delay(1000)) 以确认问题与库无关。
标签: c# asynchronous asp.net-web-api async-await asp.net-web-api2