【发布时间】:2015-09-02 22:12:53
【问题描述】:
可能这个问题已经提出,但我从未找到明确的答案。假设我有一个 Web API 2.0 应用程序托管在 IIS 上。我想我理解最佳实践(防止客户端死锁)是始终使用异步方法,从 GUI 事件到 HttpClient 调用。这很好,而且有效。但是,如果我的客户端应用程序没有 GUI(例如窗口服务、控制台应用程序)但只有同步方法可以从中进行调用,那么最佳做法是什么?在这种情况下,我使用以下逻辑:
void MySyncMethodOnMyWindowServiceApp()
{
list = GetDataAsync().Result().ToObject<List<MyClass>>();
}
async Task<Jarray> GetDataAsync()
{
list = await Client.GetAsync(<...>).ConfigureAwait(false);
return await response.Content.ReadAsAsync<JArray>().ConfigureAwait(false);
}
但不幸的是,这仍然会在客户端上导致死锁,在随机机器上随机发生。
客户端应用程序在此停止并且永远不会返回:
list = await Client.GetAsync(<...>).ConfigureAwait(false);
【问题讨论】:
-
看起来这可能是阻塞的 --> list = GetDataAsync().Result()
-
客户端或服务器死锁?
-
尝试返回结果而不是等待。
await和返回 -
这不会导致死锁,因为你使用了CA(false)。
-
我们在这里挣扎:(
标签: c# iis .net-4.5 asp.net-web-api