温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

非UI的子线程再启动线程的话,等待的时候会被阻塞,Task不会阻塞了

发布时间:2020-04-07 23:31:42 阅读:98 作者:cnming 栏目:编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

需要在.Net 4.0才会有Task

当然,既然接触到了Task,或许以后就不再用线程了,具体看情况了,之前几个线程之间就发生了阻塞问题,这次就是要解决这个问题才下这个功夫的,否则宁可被差遣抱儿子尿尿去。

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;   using System.Threading.Tasks;  using System.Threading;   namespace TaskDemo  {      class Program      {          static void Main(string[] args)          {              Thread mTH = new Thread(RunTask);              mTH.Start();               //Thread mTH1 = new Thread(RunThread);              //mTH1.Start();          }           private static void RunThread()          {              for (int i = 0; i < 20; i++)              {                  Thread.Sleep(2);                  Console.WriteLine("RunThread{0}", i);              }          }           private static void RunTask()          {              try             {                  int mCount = 0;                   CancellationTokenSource tokenSource = new CancellationTokenSource();                  CancellationToken token = tokenSource.Token;                   Task t = new Task(() =>                  {                      Console.WriteLine("进入任务……");                      Thread.Sleep(10);                      Console.WriteLine("任务开始工作……");                      //模拟工作过程                         for (int i = 0; i < 20; i++)                      {                          if (token.IsCancellationRequested == true)                          {                              break;          //这里别人是用一个throw new OperationCanceledException(token); 但是我用就会报错                          }                          mCount++;                          Console.WriteLine("RunTask{0}", i);                          Thread.Sleep(1);                      }                  }, token);                  token.Register(() =>                 {                     Console.WriteLine("Canceled");                  });                  t.Start();                  Console.WriteLine("这条语句先运行完毕了……");                  t.ContinueWith((task) =>                  {                      Console.WriteLine("任务完成,完成时候的状态为:");                      Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}\tmCount={3}", task.IsCanceled, task.IsCompleted, task.IsFaulted, mCount);                  });                  Console.WriteLine("现在就按任意键的话,程序就退出了……");                   RunThread();        //线程内部较耗时的测试                   Console.ReadKey();      //由于两个sleep都有点时间,如果在这时间之前按下任意键,结果是程序提前终止了                  tokenSource.Cancel();                  Console.ReadKey();      //程序退出               }              catch (Exception Ex)              {                  Console.WriteLine(Ex.Message);              }          }       }  }      

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×