【问题标题】:HttpClient: cancellation async HTTP request with ObjectContentHttpClient:使用 ObjectContent 取消异步 HTTP 请求
【发布时间】:2020-02-02 06:23:25
【问题描述】:

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

【问题讨论】:

  • 您到底遇到了什么异常?请张贴详细信息。为什么你会在拨打电话后立即拨打取消电话?
  • 我的期望:Wait() 方法必须在 InnerException 属性中抛出带有 TaskCancelledException 的 AggregateException。 Cancel() 可以在任何时候被调用,包括在创建任务之后。
  • 你能用var result = task.Result; 替换task.Wait(); 并检查结果吗?很想知道通话是否真的成功完成。 (我认为这是出于说明目的,所以我将不讨论与await 异步执行此操作的讲座:)
  • Wait() 永远不会将控制权返回给调用线程。将此添加到我的问题中,谢谢您的评论。是的,这是为了说明目的:)

标签: c# .net dotnet-httpclient


【解决方案1】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多