设为首页 加入收藏

TOP

C# Task 篇幅一(一)
2019-09-17 18:20:07 】 浏览:66
Tags:Task 篇幅

https://www.cnblogs.com/loverwangshan/p/10415937.html中我们有讲到委托的异步方法,Thread,ThreadPool,然后今天来讲一下Task,

ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:

  1. ThreadPool不支持线程的取消、完成、失败通知等交互性操作
  2.  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
View Code

 

一: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 }
View Code

通过执行结果如下:

通过观察发现:

  • Sleep是同步执行方法,即是遇到Sleep先等待,然后才能接着做其它的
  • Delay是异步执行方法,一般不会单独使用,而是会跟ContinueWith等一起联合使用,即是重新开启一个线程,这个线程多少时间之后执行!

三:TaskFactory类的ContinueWhenAny 和 ContinueWhenAll

 1  
 2   /// <summary>
 3   /// 模拟Coding过程
 4   /// </summary>
 5   /// <param name="name"></param>
 6   /// <param name="projectName">
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇数据库索引,到底是什么做的? 下一篇Kafka生产者案例报警告SLF4J: Fai..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目