在https://www.cnblogs.com/loverwangshan/p/10415937.html中我们有讲到委托的异步方法,Thread,ThreadPool,然后今天来讲一下Task,
ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
- ThreadPool不支持线程的取消、完成、失败通知等交互性操作
- ThreadPool不支持线程执行的先后次序
以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在.netFramwork3.0出现的Task,线程是基于线程池,然后提供了丰富的API
下面我们来初步认识一下Task,下面我们先新增一个公共的方法以下方法的演示中都会用到:
1 #region Private Method 2 /// <summary> 3 /// 一个比较耗时耗资源的私有方法 4 /// </summary> 5 /// <param name="name"></param> 6 private void DoSomethingLong(string name) 7 { 8 Console.WriteLine($"****DoSomethingLong Start {name} {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}*****"); 9 long lResult = 0; 10 for (int i = 0; i < 1000000000; i++) 11 { 12 lResult += i; 13 } 14 Console.WriteLine($"****DoSomethingLong End {name} {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} {lResult}****"); 15 } 16 #endregion
一:Task启动任务的几种方式
1 { 2 Task task = new Task(() => this.DoSomethingLong("btnTask_Click_1")); 3 task.Start(); 4 } 5 { 6 Task task = Task.Run(() => this.DoSomethingLong("btnTask_Click_2")); 7 } 8 { 9 TaskFactory taskFactory = Task.Factory;// Task.Factory等同于: new TaskFactory() 10 Task task = taskFactory.StartNew(() => this.DoSomethingLong("btnTask_Click_3")); 11 }
二:Task.Delay()和Thread.Sleep()方法的比较运用
1 private void Test() 2 { 3 Console.WriteLine($"****************btnTask_Click Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************"); 4 { 5 Stopwatch stopwatch = new Stopwatch(); 6 stopwatch.Start(); 7 Console.WriteLine("在Sleep之前"); 8 Thread.Sleep(2000); //同步等待--当前线程等待2s 然后继续 9 Console.WriteLine("在Sleep之后"); 10 stopwatch.Stop(); 11 Console.WriteLine($"Sleep耗时{stopwatch.ElapsedMilliseconds}"); 12 } 13 { 14 Stopwatch stopwatch = new Stopwatch(); 15 stopwatch.Start(); 16 Console.WriteLine("在Delay之前"); 17 Task task = Task.Delay(2000) 18 .ContinueWith(t => 19 { 20 stopwatch.Stop(); 21 Console.WriteLine($"Delay耗时{stopwatch.ElapsedMilliseconds}"); 22 Console.WriteLine($"This is ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}"); 23 });//异步等待--等待2s后启动新任务 24 Console.WriteLine("在Delay之后"); 25 } 26 Console.WriteLine($"****************btnTask_Click End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************"); 27 }
通过执行结果如下:
通过观察发现:
- Sleep是同步执行方法,即是遇到Sleep先等待,然后才能接着做其它的
- Delay是异步执行方法,一般不会单独使用,而是会跟ContinueWith等一起联合使用,即是重新开启一个线程,这个线程多少时间之后执行!
三:TaskFactory类的ContinueWhenAny 和 ContinueWhenAll
1 2 /// <summary> 3 /// 模拟Coding过程 4 /// </summary> 5 /// <param name="name"></param> 6 /// <param name="projectName">