[英]HttpClient: cancellation async HTTP request with ObjectContent
在下面的代码中,Wait() 方法永远不会抛出由任务取消引起的异常,并且永远不会将控制权返回给调用线程。
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://stackoverflow.com")
{
Content = new ObjectContent<Foo>(new Foo(), new JsonMediaTypeFormatter())
};
CancellationTokenSource cts = new CancellationTokenSource();
HttpClient client = new HttpClient();
Task task = client.SendAsync(request, cts.Token);
cts.Cancel();
task.Wait();
但是当 request.Content 是带有序列化 Foo 对象的 StringContent 时,会抛出异常。 我的期望是所有 HttpContent 类型都会抛出异常。
为什么不抛出异常?
创建 StringContent 的解决方法不好。 也许存在另一种解决方法?
您编写了经典的异步死锁 task.Wait 等待操作,该操作永远不会完成,因为您的线程在“等待”中被阻塞。 您需要等待任务,然后它会按预期工作。 取消异常将在 await 线上抛出。
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://stackoverflow.com")
{
Content = new ObjectContent<Foo>(new Foo(), new JsonMediaTypeFormatter())
};
CancellationTokenSource cts = new CancellationTokenSource();
HttpClient client = new HttpClient();
Task task = client.SendAsync(request, cts.Token);
cts.Cancel();
await task;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.