HttpClient:具有ObjectContent的取消异步HTTP请求

问题描述 投票:1回答:1

在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的解决方法不好。也许是否存在其他解决方法?

c# .net dotnet-httpclient
1个回答
0
投票

您编写了经典的异步死锁任务。等待等待操作,该操作将永远不会完成,因为您的线程在“等待”中被阻塞。您需要等待任务,然后它将按预期工作。取消异常将在等待行上引发。

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;
© www.soinside.com 2019 - 2024. All rights reserved.