.Net6.0系列-4.Net 6及以上异步编程Cancellation以及WhenAll/WhenAnyToken详解(三)
创始人
2024-06-02 02:52:11
0

一.CancellationToken结构体使用详解
包含的属性:
None:空
Register(Action callback):注册/取消监听
ThrowIfCancellationRequested():如果任务被取消,就抛出异常
CancelAfter():设置等待多长时间以后超时,单位毫秒
Cancel():直接发出退出信息
通过 CancellationToken Token 传递信息
如果异步方法存在CancellationToken参数的话可以通过传递 CancellationToken来实现
举例:var resp=await client.GetAsync(url,cancellationToke)
这种方式也是通过抛出异常来退出异步执行的

//这个例子展示的是通过手动捕获退出信号,然后退出,如果不进行手动捕获取消信号程序是不会退出的
static async Task Main(string[] args)
{CancellationTokenSource cts=new CancellationTokenSource();cts.CancelAfter(3000);CancellationToken cToken=cts.Token;await DownloadAsync("https://www.baidu.com",200,cToken);
}static async Task DownloadAsync(string url,int Times,CancellationToken cancellationToken)
{using(HttpClient client=new HttpClient()){for(int k=0;kstring html=await client.GetStringAsync(url);Console.WriteLine($"{DateTime.Now}:{html}");//手动捕获退出信号if(cancellationToken.IsCancellationRequested){Console.WriteLine("收到退出的信号,执行退出");break;}//下面这种事抛出异常的方式退出异步执行//cancellationToken.ThrowIfCancellationRequested();}}
}

二:web开发使用情形,当用户关闭浏览器或者访问别的网页的时候该网页的请求如果在服务器端没有完成的,则服务器会自动终止访问请求,可以节省服务器资源

//vs mvc自动生成的代码
public IActionResult Index()
{return View();
}
//将上面的代码修改为以下的形式传递CancellationToken参数,该参数是由.net框架自动传递的,不需要手动传递.
//当网页关闭或者刷新的时候框架会自动传递取消信号被HttpClient捕获并退出,所以异步方法尽量都传递CancellationToken参数
public async Task Index(CancellationToken cancellationToken)
{await DownloadAsync("https://163.com",50,cancellationToken);return View();
}
static async Task DownloadAsync(string url,int n,CancellationToken cancellationToken)
{using(HttpClient client=new HttpClient()){for(int i=0;ivar resp=await client.GetAsync(url,cancellationToken);string strHtml=await resp.Content.ReadAsStringAsync();Debug.WriteLine(strHtml);}}
}

三. Task类中 WhenAll与WhenAny的使用
1.Task WhenAny(IEnumerable tasks):只要tasks中的任何一个Task完成,即可向下执行
2.Task WhenAll(IEnumerable tasks):等待tasks中的Task全部完成,才会向下执行
3.FromResult():创建将普通数值转换为Task对象

static async Task Main(string[] args)
{string [] files=Directory.GetFiles(@"E:\temp\a");Task[] countTasks=new Task[files.Length];for(int i=0;istring filename=files[i];Task t=ReadCharsCount(filename);counttTasks[i]=t;}int[] counts=await Task.WhenAll(countTasks);int c=counts.Sum();Console.WriteLine(c);
}
static async Task ReadCharsCount(string fileName)
{string s=await File.ReadAllTextAsync(fileName);return s.Length;
}

相关内容

热门资讯

我来教大家“中兴国际辅助器ap... 亲,中兴国际这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,中兴国际的开挂软件,名...
我来教大家“猪猪侠辅助器app... 亲,猪猪侠这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,猪猪侠的开挂软件,名称叫...
我来教大家“半夏游戏辅助器ap... 半夏游戏这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游...
我来教大家“海讯游戏辅助器ap... 亲,海讯游戏这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,海讯游戏的开挂软件,名...
我来教大家“星悦桂柳麻将辅助器... 我来教大家“星悦桂柳麻将辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第...
我来教大家“永乐跑胡子辅助器a... 亲,永乐跑胡子这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,永乐跑胡子的开挂软件...
我来教大家“点我棋牌辅助器ap... 我来教大家“点我棋牌辅助器app官方下载最新版本更新”详细分享开挂是一款可以让一直输的玩家,快速成为...
我来教大家“万圣节消除大战辅助... 我来教大家“万圣节消除大战辅助器app官方下载最新版本更新”详细分享开挂;原来确实真的有挂(需添加指...
我来教大家“天胡麻将辅助器ap... 您好,天胡麻将这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“宁乐互娱辅助器ap... 我来教大家“宁乐互娱辅助器app官方下载最新版本更新”详细分享开挂一、宁乐互娱AI软件牌型概率发牌机...
我来教大家“欢乐众娱辅助器ap... 亲,欢乐众娱这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,欢乐众娱的开挂软件,名...
我来教大家“八戒麻将辅助器ap... 我来教大家“八戒麻将辅助器app官方下载最新版本更新”详细分享开挂是一款可以让一直输的玩家,快速成为...
我来教大家“星辰辅助器app官... 我来教大家“星辰辅助器app官方下载最新版本更新”详细分享开挂一、星辰AI软件牌型概率发牌机制”必胜...
我来教大家“悟空竞技麻将辅助器... 我来教大家“悟空竞技麻将辅助器app官方下载最新版本更新”详细分享开挂一、悟空竞技麻将AI软件牌型概...
我来教大家“南通长牌辅助器ap... 我来教大家“南通长牌辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“捕鱼大决战辅助器a... 亲,捕鱼大决战这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,捕鱼大决战的开挂软件...
我来教大家“蜀山四川麻将辅助器... 您好:蜀山四川麻将确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都...
我来教大家“东游麻将辅助器ap... 您好:东游麻将确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发...
我来教大家“一生棋牌辅助器ap... 我来教大家“一生棋牌辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“边锋陕西麻将辅助器... 我来教大家“边锋陕西麻将辅助器app官方下载最新版本更新”详细分享开挂是一款可以让一直输的玩家,快速...