当前位置:首页 > 技能相关 > .NET > 正文内容

.NET 通过CancellationToken参数终止异步方法

admin2年前 (2023-02-21).NET2890 修订时间:2023-02-21 09:47:10

CancellationToken结构体

None:空

bool IsCancellationRequested        是否取消

(*)Register(Action callbck)     注册取消监听

ThrowIfCancellationRequested()    如果任务被取消,执行到这句话就抛出异常。

CancellationTokenSource

CancelAfter()       超时后发出取消信号

Cancel()               发出取消信号

CancellationToken Token 

示例代码:

1、原始代码

static async Task Main(string[] args)
 {
   await downloadAsync("https://www.baidu.com",100);
 }
static async Task downloadAsync(string url,int n )
 {

    using (HttpClient client = new HttpClient())
    {
       for (int i = 0; i < n; i++)
       {
         string html = await client.GetStringAsync(url);
         Console.WriteLine($"{DateTime.Now}:{html}");
       }
    }
 }

2、固定秒数取消

static async Task Main(string[] args)
 {
   CancellationTokenSource cts = new CancellationTokenSource();
   cts.CancelAfter(5000);
   await downloadAsync("https://www.baidu.com",100,cts.Token);
 }
static async Task downloadAsync(string url, int n, CancellationToken cancellationToken)
 {

   using (HttpClient client = new HttpClient())
   {
      for (int i = 0; i < n; i++)
      {
         string html = await client.GetStringAsync(url);
         Console.WriteLine($"{DateTime.Now}:{html}");
         if(cancellationToken.IsCancellationRequested)
         {
           Console.WriteLine("请求被取消");
           break;
         }
      }
   }
 }

上述的IF判断,也可以替换为,当然这个是抛出一个异常,不建议使用

cancellationToken.ThrowIfCancellationRequested();

也可以修改为如下:

        static async Task downloadAsync2(string url, int n, CancellationToken cancellationToken)
        {

            using (HttpClient client = new HttpClient())
            {
                for (int i = 0; i < n; i++)
                {
                    var resp = await client.GetAsync(url, cancellationToken);
                    string html = await resp.Content.ReadAsStringAsync();
                    Console.WriteLine($"{DateTime.Now}:{html}");
                }
                
            }
        }

第一种方式与第二种方式都是抛出异常,手动处理和自动处理异常两种区别;

3、按键终止

        static async Task Main(string[] args)
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            await downloadAsync2("http://blog.lifeiai.com:88",10000,cts.Token);
            while (Console.ReadLine()!="z")
            {
            }
            cts.Cancel();
            Console.ReadLine();
        }
        static async Task downloadAsync2(string url, int n, CancellationToken cancellationToken)
        {

            using (HttpClient client = new HttpClient())
            {
                for (int i = 0; i < n; i++)
                {
                    var resp = await client.GetAsync(url, cancellationToken);
                    string html = await resp.Content.ReadAsStringAsync();
                    Console.WriteLine($"{DateTime.Now}:{html}");
                }
                if (cancellationToken.IsCancellationRequested)
                {
                    Console.WriteLine("请求被取消");
                    break;
                }


            }
        }

以上代码执行后有失效问题,后期待查

 您阅读本篇文章共花了: 

免责声明
本站内容均为博客主本人日常使用记录的存档,如侵犯你的权益请联系:lifei@zaiheze.com 546262132@qq.com 沟通删除事宜。本站仅带访问端口形式使用,已杜绝搜索引擎爬取。

扫描二维码推送至手机访问。

版权声明:本文由LIFEI - blog发布,如需转载请注明出处。

本文链接:http://www.lifeiai.com/?id=294

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。