【发布时间】:2015-08-25 04:34:04
【问题描述】:
使用HttpClient 并避免死锁的最佳方法是什么?我正在使用下面的代码,完全从同步方法调用,但我担心它可能会导致死锁。
我已经阅读了诸如 .ConfigureAwait(false)、.GetAwaiter()、.GetResult() 之类的函数,但我正在寻找有关最佳实践方法的意见。
代码不完全准确,但足够接近。
public static bool TryRequest(string url, out response)
{
HttpContent content = new StringContent(json, Encoding.UTF8, "application/json");
using (HttpClient client = new HttpClient())
{
HttpResponseMessage responseMessage = null;
switch (verb)
{
case HttpVerb.Put:
responseMessage = client.PutAsync(url, content).Result;
break;
case HttpVerb.Post:
responseMessage = client.PostAsync(url, content).Result;
break;
case HttpVerb.Delete:
responseMessage = client.DeleteAsync(url).Result;
break;
case HttpVerb.Get:
responseMessage = client.GetAsync(url).Result;
break;
}
if (responseMessage.IsSuccessStatusCode)
{
responseContent = responseMessage.Content.ReadAsStringAsync().Result;
statusCode = responseMessage.StatusCode;
}
}
}
【问题讨论】:
-
为什么你认为这段代码会导致死锁
-
我在 HttpClient 上设置了超时,但我仍然偶尔会在高负载下看到问题(请求持续很长时间)。
-
能否添加调用代码
-
@3dd 因为确实如此。
Task.Result与 WinForms 或 WPF 中的SynchronizationContext一起使用时,几乎可以保证死锁,因为Task.Result将阻塞直到Task.IsComplete,但是,Task正在等待SynchronizationContext运行回调,导致死锁。 -
感谢@Aron 说得通
标签: c#