可能已经有人提过这个问题了,但是我从来没有找到一个明确的答案。假设我有一个托管在IIS上的Web API 2.0应用程序。我认为最佳实践(为了防止客户端死锁)是从GUI事件到HttpClient调用始终使用异步方法。这很好并且有效。但是如果我的客户端应用程序没有GUI(例如Windows服务、控制台应用程序),而是只有同步方法来进行调用,那么最佳实践是什么呢?在这种情况下,我使用以下逻辑:
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);
await
和return
。 - Amit Kumar Ghosh