当前位置: 首页 > news >正文

做网站包头/石家庄seo扣费

做网站包头,石家庄seo扣费,网络营销策划书的结构及技巧,重点实验室网站建设的意义上一篇我讲解了await和async关键字,这两个关键字的作用是将async限定的方法中await关键字后面的部分封装成一个委托,该委托会在await修饰的Task完成后再执行。简单的说,就是等待任务完成后,后面的程序才执行,且该等待不…
上一篇我讲解了await和async关键字,这两个关键字的作用是将async限定的方法中await关键字后面的部分封装成一个委托,该委托会在await修饰的Task完成后再执行。简单的说,就是等待任务完成后,后面的程序才执行,且该等待不会造成线程阻塞。关键是在任务执行完成后,程序会继续交给主线程执行。接下来,我来介绍在任务执行结束后,用新任务来执行方法。

 

废话不多上,上代码,我们来看看如何在任务结束后继续由线程池继续完成其他方法。

 1 static void Main(string[] args)
 2 {
 3     RunAsync();
 4     Console.WriteLine("Async Run");
 5     Console.Read();
 6 }
 7 public static void RunAsync()
 8 {
 9     var task = Task.Run(() =>
10     {
11         Thread.Sleep(2000);
12         return "task finished";
13     });
14     //当task完成后,会在由线程池继续执行
15     task.ContinueWith(t =>
16     {
17         Thread.Sleep(2000);
18         Console.WriteLine(task.Result);
19     });
20 }

可以看到,RunAsync方法中并没有添加async和await关键字,但是运行程序后,主线程没有被阻塞。这是因为ContinueWith会将委托参数“挂”到线程池的任务队列中,该委托只有在task执行结束后,才会开始执行。ContinueWith方法会返回一个Task,该Task就是task执行结束后会开始执行的Task,该Task也是可以等待的。注意,ContinueWIth和await关键字的区别就在:await在任务完成后,会由主线程继续执行,但是ContinueWith中的方法会继续由线程池执行。

接下来,我们来了解一下,任务能否取消,以及取消后会发生什么。

C#提供的任务取消的方式是“协作式”取消,在构造任务时,需要先构造一个System.Threading.CancellationTaskSource对象,该对象看起来像这样

1  public sealed class CancellationTaskSource:IDisposable{
2     public CancellationTokenSource();
3     public void Dispose();//释放资源
4     public bool IsCancellationRequested{get;}
5     public CancellationToken Token{get;}  
6     public void Cancel();//内部调用Cancel并传递false
7     public void Cancel(bool throwOnFirstException);
8 }

CancellationTaskSource对象中含有一个Token,它的类型是CancellationToken,这是一个轻量级值类型,它包含一个私有的对CancellationTaskSource的引用,当构造Task时,需要将这个Token传入,如下所示

static void Main(string[] args){CancelTask();Console.WriteLine("Async Run");Console.Read();
}
public static void CancelTask()
{//定时1000ms后自动取消任务var cancelSource = new CancellationTokenSource(1000);Task.Run(() =>{//模拟其他任务Thread.Sleep(4000);//如果取消请求已发送,则不会显示Task overif (!cancelSource.IsCancellationRequested)Console.WriteLine("Task over");}, cancelSource.Token);cancelSource.Token.Register(() => Console.WriteLine("Task cancel"));
}

 

运行后可以看到大约1秒后,控制台显示了Task cancel,并且在没有显示Task over。证明任务被取消了。Task.Run()方法的其中一个重载是接受一个CancelToken参数,我们传入的是cancelSource的Token,这表明cancelSource就可以控制Task的取消与否。我的做法是在1秒后自动取消任务,也可以手动调用cancelSource.Cancel()方法来显式取消任务。我在Token上订阅了取消的事件,在任务被取消后,执行我的方法,这里是控制台打印出Task cancel。也可以在任务中,利用“闭包”,将Token传入到任务中,如下

 1 static void Main(string[] args){
 2     CancelTask();
 3     Console.WriteLine("Async Run");
 4     Console.Read();
 5 }
 6 public static void CancelTask(){
 7     var cancelSource = new CancellationTokenSource(1000);
 8     Task.Run(() =>{
 9         int count = 0;
10         for (int i = 0; i < 1000; i++)
11         {
12             if (cancelSource.IsCancellationRequested)
13                 break;
14             count+=i;
15             Thread.Sleep(30);
16         }
17         Console.WriteLine(count);
18     }, cancelSource.Token);
19     cancelSource.Token.Register(() => Console.WriteLine("Task cancel"));
20 }

手动取消有2个方法,一是cancelSource.Cancel(),另一个是cancelSource.CancelAfter(),示例如下

 1 public static void CancelTask(){
 2     var cancelSource = new CancellationTokenSource();
 3     Task.Run(() =>
 4     {
 5         Thread.Sleep(4000);
 6         Console.WriteLine("Task over");
 7     }, cancelSource.Token);
 8     cancelSource.Token.Register(() => Console.WriteLine("Task cancel"));
 9     //此处调用cancelSource.Cancel()的话会立即结束任务
10     //该方法会大约1秒后取消任务
11     cancelSource.CancelAfter(1000);
12 }

该示例和上面的在构造函数中传入1000ms的延时是一样的效果,若调用Cancel(),则立刻结束任务。

以上就是本篇内容,介绍了Task.ContinueWith方法,以及如何取消任务。若文中不能满足你的要求,可以查看诸如Task.Run()或者Task.ContinueWith()方法的几个重载,还有其他的使用方法,本人并没有将全部细枝末节全部学会,主要的目的是掌握多线程的基本使用方法。《CLR via C#》书中也有很详细的讲解,我的这个系列就是从该书中提取,有兴趣的小伙伴可以看一看。欢迎有问题的和我在评论区交流。

下一篇,我给大家介绍一下C#并行的奇技淫巧:并行的For、Foreach循环以及PLINQ。

转载于:https://www.cnblogs.com/jazzpop/p/8527532.html

http://www.lbrq.cn/news/1294399.html

相关文章:

  • 个人网站创建/企业文化理念
  • 网站开发定位/黑马it培训班出来现状
  • 国内最新重大新闻/指定关键词seo报价
  • 教育中介公司网站建设费用/网络营销的培训课程
  • 怎么让学生在网站上做问卷调查/百度收录入口在哪里
  • 高端网网站建设/网站推广营销运营方式
  • 求职网站开发多少钱/长春百度推广公司
  • 电商摄影/seo产品优化免费软件
  • crazyuncle WordPress/某网站seo诊断分析
  • html全部源码免费/北京seo优化诊断
  • 中山做网站优化/百度识图网页版 在线
  • 网站建设服务合同缴纳印花税吗/百度广告联盟怎么加入
  • php ajax网站开发/百度企业认证怎么认证
  • 医院建网站/百度收录api怎么提交
  • 中国建设银行江西分行网站首页/百度收录
  • 广州哪家做网站/长尾关键词挖掘工具
  • 做一家电商网站需要多少钱/企业网站模板 免费
  • 网站建设需求说明书/泉州搜索推广
  • 页面设计一般用什么软件/seo专业培训
  • 我司如何自己建设动态网站/关键词搜索引擎又称为
  • 信息课做网站的软件/seo咨询师
  • 做学校网站的目的是什么/恶意点击软件哪个好
  • 上海建筑工程股份有限公司/江西短视频seo搜索报价
  • 做的美食视频网站/百度推广可以自己开户吗
  • 澳门网站建设/免费学生网页制作成品代码
  • 酒店电子商务网站策划书/制作一个网站大概需要多少钱
  • 网站建设百度搜索到左边的图/网络营销管理
  • js网站建设/b站2020推广网站
  • 常德公司做网站/百度广告联盟平台的使用知识
  • 实验一html静态网站开发/百度上海总部
  • 编译支持cuda硬件加速的ffmpeg
  • Linux系统中全名、用户名、主机名的区别
  • Keil编译文件格式转换全解析
  • Windows11下编译好的opencv4.8-mingw,可下载后直接用
  • 智能光电检测:YOLO+OpenCV联合算法工程实践
  • Maven下载安装与idea配置