不等待HttpClient使用时会发生什么情况

克里斯·马里西奇

给定的代码类似于

Task.Run(() =>
{
    using (var client = new HttpClient())
    {
        var responseTask = client.GetAsync(urlToInvoke);
    }
});

在这种情况下,它似乎GetAsync实际上没有运行。是在完成之前取消任务还是在这里实际发生了什么?

现在,如果您稍作更改并插入

Task.Run(() =>
{
    using (var client = new HttpClient())
    {
        var responseTask = client.GetAsync(urlToInvoke);

        Task.Delay(5000).Wait()
    }
});

GetAsync确实执行完了。这里发生了什么?是否使Task.Delay自己隶属于responseTask最终使之等同于内部的同一任务responseTask.Wait()

斯科特·张伯伦

您正在错误地考虑它。这是类内部正在发生的事情的伪版本。

class HttpClient : IDisposeable
{
    private CancelationTokenSource _disposeCts;

    public HttpClient()
    {
        _disposeCts = new CancelationTokenSource();
    }

    public Task<HttpResponseMessage> GetAsync(string url)
    {
        return GetAsync(url, CancellationToken.None);
    }

    public async Task<HttpResponseMessage> GetAsync(string url, CancelationToken token)
    {
        var combinedCts =
            CancellationTokenSource.CreateLinkedTokenSource(token, _disposeCts.Token);
        var tokenToUse = combinedCts.Token;

        //... snipped code

        //Some spot where it would good to check if we have canceled yet.
        tokenToUse.ThrowIfCancellationRequested();

        //... More snipped code;

        return result;
    }

    public void Dispose()
    {
        _disposeCts.Cancel();
    }

    //... A whole bunch of other stuff.
}

重要的是要在退出该using块时取消内部取消令牌。

在您的第一个示例中,任务尚未完成,因此tokenToUse如果ThrowIfCancellationRequested()被调用将立即引发

在您的第二个示例中,任务已经完成,因此取消内部令牌的操作对由于已达到完成状态而返回的任务没有影响。

这就像问为什么这导致任务被取消。

using (var client = new HttpClient())
{
    var cts = new CancellationTokenSource()
    var responseTask = client.GetAsync(urlToInvoke, cts.Token);

    cts.Cancel();
}

但这不是

using (var client = new HttpClient())
{
    var cts = new CancellationTokenSource()
    var responseTask = client.GetAsync(urlToInvoke, cts.Token);

    Task.Delay(5000).Wait()
    cts.Cancel();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Haskell中用+编写*时会发生什么情况?

来自分类Dev

在Git中删除分支时会发生什么情况

来自分类Dev

将函数用作参数时会发生什么情况?

来自分类Dev

使用类函数更改S4对象的“类”时会发生什么情况?

来自分类Dev

使用“ + =”在Java中“更改”字符串时会发生什么情况?

来自分类Dev

当您使用“ + =”在Java中“更改”字符串时会发生什么情况?

来自分类Dev

等待加入条件变量的线程会发生什么情况?

来自分类Dev

构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

来自分类Dev

构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

来自分类Dev

RabbitMQ Java客户端:当在使用者的handleDelivery()方法中抛出RuntimeException时会发生什么情况?

来自分类Dev

当您按Esc键退出全屏时会发生什么情况?如何使用按钮复制它?

来自分类Dev

了解我使用Ctrl-v转储终端字符序列时会发生什么情况?

来自分类Dev

以管理员身份使用时会发生什么?

来自分类Dev

当我从RAM运行持久性存储实时USB时会发生什么情况?

来自分类Dev

当我离开INT_MAX以外时会发生什么情况?

来自分类Dev

将数组作为参数传递时会发生什么情况?

来自分类Dev

服务在调用stopSelf()后收到启动命令时会发生什么情况

来自分类Dev

将可移动对象插入std :: set失败时会发生什么情况?

来自分类Dev

重复printf说明符标志时会发生什么情况?

来自分类Dev

应用程序在Cordova中退出时会发生什么情况?

来自分类Dev

以Express应用程序作为参数评估require(“ http”)。Server()时会发生什么情况?

来自分类Dev

调用订阅的PayPal REST API执行URL时会发生什么情况

来自分类Dev

通过fcntl锁定位于远程存储上的文件时会发生什么情况?

来自分类Dev

将1Byte数据转换为4Byte时会发生什么情况

来自分类Dev

当线程进入Java中的同步块/方法时会发生什么情况

来自分类Dev

当您清除Android应用程序的存储空间时会发生什么情况

来自分类Dev

当我从RAM运行持久性存储实时USB时会发生什么情况?

来自分类Dev

将属性应用于python中的类方法时会发生什么情况?

来自分类Dev

VB.NET中的类型之间进行转换时会发生什么情况?

Related 相关文章

  1. 1

    在Haskell中用+编写*时会发生什么情况?

  2. 2

    在Git中删除分支时会发生什么情况

  3. 3

    将函数用作参数时会发生什么情况?

  4. 4

    使用类函数更改S4对象的“类”时会发生什么情况?

  5. 5

    使用“ + =”在Java中“更改”字符串时会发生什么情况?

  6. 6

    当您使用“ + =”在Java中“更改”字符串时会发生什么情况?

  7. 7

    等待加入条件变量的线程会发生什么情况?

  8. 8

    构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

  9. 9

    构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

  10. 10

    RabbitMQ Java客户端:当在使用者的handleDelivery()方法中抛出RuntimeException时会发生什么情况?

  11. 11

    当您按Esc键退出全屏时会发生什么情况?如何使用按钮复制它?

  12. 12

    了解我使用Ctrl-v转储终端字符序列时会发生什么情况?

  13. 13

    以管理员身份使用时会发生什么?

  14. 14

    当我从RAM运行持久性存储实时USB时会发生什么情况?

  15. 15

    当我离开INT_MAX以外时会发生什么情况?

  16. 16

    将数组作为参数传递时会发生什么情况?

  17. 17

    服务在调用stopSelf()后收到启动命令时会发生什么情况

  18. 18

    将可移动对象插入std :: set失败时会发生什么情况?

  19. 19

    重复printf说明符标志时会发生什么情况?

  20. 20

    应用程序在Cordova中退出时会发生什么情况?

  21. 21

    以Express应用程序作为参数评估require(“ http”)。Server()时会发生什么情况?

  22. 22

    调用订阅的PayPal REST API执行URL时会发生什么情况

  23. 23

    通过fcntl锁定位于远程存储上的文件时会发生什么情况?

  24. 24

    将1Byte数据转换为4Byte时会发生什么情况

  25. 25

    当线程进入Java中的同步块/方法时会发生什么情况

  26. 26

    当您清除Android应用程序的存储空间时会发生什么情况

  27. 27

    当我从RAM运行持久性存储实时USB时会发生什么情况?

  28. 28

    将属性应用于python中的类方法时会发生什么情况?

  29. 29

    VB.NET中的类型之间进行转换时会发生什么情况?

热门标签

归档