首页 > 其他分享 >第十八节:异步补充(CancellationToken终止信号、whenAll、whenAny、yeild return的用法)

第十八节:异步补充(CancellationToken终止信号、whenAll、whenAny、yeild return的用法)

时间:2022-12-25 18:48:07浏览次数:65  
标签:CancellationToken Task return string yeild yield Console

一. CancellationToken终止信号

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

{
    CancellationTokenSource cts = new();
    cts.CancelAfter(4000);  //4s后取消
    await Download1Async("http://www.baidu.com", 200, cts.Token);

    //写法1:GetStringAsync + IsCancellationRequested 实现取消
    static async Task Download1Async(string url, int count, CancellationToken cancellationToken)
    {
        using HttpClient client = new();
        for (int i = 0; i < count; i++)
        {
            string html = await client.GetStringAsync(url);
            Console.WriteLine(html);
            if (cancellationToken.IsCancellationRequested)
            {
                Console.WriteLine("请求取消");
                break;
            }
        }
    }


    //写法2:GetStringAsync + ThrowIfCancellationRequested()
    static async Task Download1Async(string url, int count, CancellationToken cancellationToken)
    {
        using HttpClient client = new();
        for (int i = 0; i < count; i++)
        {
            string html = await client.GetStringAsync(url);
            Console.WriteLine(html);
            cancellationToken.ThrowIfCancellationRequested();  //抛异常实现取消
        }
    }

    //写法3:直接传入CancellationToken参数,用于获得提前终止执行的信号。
    static async Task Download1Async(string url, int count, CancellationToken cancellationToken)
    {
        using HttpClient client = new();
        for (int i = 0; i < count; i++)
        {
            string html = await client.GetStringAsync(url, cancellationToken);  //直接传入参数实现取消
            Console.WriteLine(html);
        }
    }

}

 

二. whenAll 和 whenAny

WhenAny,任何一个Task完成,Task就完成
WhenAll,所有Task完成,Task才完成。用于等待多个任务执行结束,但是不在乎它们的执行顺序

Task<string> t1 = File.ReadAllTextAsync("d:/1.txt");
Task<string> t2 = File.ReadAllTextAsync("d:/2.txt");
Task<string> t3 = File.ReadAllTextAsync("d:/3.txt");
string[] results = await Task.WhenAll(t1, t2, t3);
string s1 = results[0];
string s2 = results[1];
string s3 = results[2];

 

三. yield return 和异步

  yield return不仅能够简化数据的返回,而且可以让数据处理“流水线化”,提升性能

    /*
      执行顺序:
        先执行 yield return "ypf1"; → 输出ypf1 → yield return "ypf2"; →输出ypf2→yield return "ypf3";→输出ypf3
   */
    foreach (var item in Test1())
    {
        Console.WriteLine(item);
    }
    /*
     执行顺序:先把Test2执行完,然后依次遍历即可
     */
    foreach (var item in Test2())
    {
        Console.WriteLine(item);
    }
    static IEnumerable<string> Test1()
    {
        yield return "ypf1";
        yield return "ypf2";
        yield return "ypf3";
    }
    static IEnumerable<string> Test2()
    {
        List<string> list = new();
        list.Add("ypf1");
        list.Add("ypf2");
        list.Add("ypf3");
        return list;
    }

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

标签:CancellationToken,Task,return,string,yeild,yield,Console
From: https://www.cnblogs.com/yaopengfei/p/17004357.html

相关文章

  • git系列---【解决git clone时fatal: unable to access ‘https://gitee.com/XXX.git/
    1.常见原因:无权访问,可能是本机录入的gitee账号和现在要进行clone的gitee账号不同导致的权限问题2.解决方法:1)控制面板--用户账户--凭证管理器--windows凭据2)点击编辑更......
  • [CF1422D] Returning Home 题解
    题目描述一个\(n\timesn\)的网格,求两点间最短用时。你可以用一分钟向上下左右任意一个方向移动一格.特别的,城市中有\(m\)个传送点,第\(i\)个的坐标为\((x_{i},y_{i})......
  • .net core 5,6,7【多线程笔记】取消令牌(CancellationToken)
    介绍在使用C#异步的场景,多多少少会接触到CancellationTokenSource。它和取消异步任务相关的,CancellationToken就是它生产出来的。演示任务取消执行回调vartokenSource......
  • When to use next() and return next() in Node.js
    Somepeoplealwayswritereturnnext()istoensurethattheexecutionstopsaftertriggeringthecallback.Ifyoudon'tdoit,yourisktriggeringthecallback......
  • return两个值
    /***方法1:使用集合类(Map以外的集合类也可以随意使用)*目标:返回一个数组的最大值和最小值*/publicMap<String,Integer>test1(int[]arr){Map<Stri......
  • 解决使用innobackupex备份mysql产生returned OS error 124【转】
    ###简介今天在使用innobackupex全量备份数据库的时候发生了下面的错误错误详情19070515:22:18>>logscannedupto(258819807308)xtrabackup:Generatingalist......
  • 通过 CancellationToken 提高 Web 性能
    https://www.cnblogs.com/newbe36524/p/16975042.html 在Web开发中,经常会遇到这样的场景:用户发起一个请求,Web服务器执行一些计算密集型的操作,等待结果返回给用户。这......
  • Python中的return
    Python中,用def语句创建函数时,可以用return语句指定应该返回的值,该返回值可以是任意类型。。return语句就是讲结果返回到调用的地方,并把程序的控制权一起返回程序运......
  • 通过 CancellationToken 提高 Web 性能
    在Web开发中,经常会遇到这样的场景:用户发起一个请求,Web服务器执行一些计算密集型的操作,等待结果返回给用户。这种情况下,如果用户在等待结果的过程中取消了请求,那么服务器......
  • jenkins 设置Git SSH凭证后,构建Git更新报错returned status code 128解决
    报错问题如下:Failedtoconnecttorepository:Command"gitls-remote-hgit@IP地址:python/django.gitHEAD"returnedstatuscode128:stdout:stderr:NoECDSAho......