繁体   English   中英

HttpClient:使用 ObjectContent 取消异步 HTTP 请求

[英]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 类型都会抛出异常。

  1. 为什么不抛出异常?

  2. 创建 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM