C# Task的用法

摘要:
C#Task的用法其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观。顺便提一下,配合CancellationTokenSource类更为可以轻松的对Task操作的代码进行中途终止运行,会在后面的章节中讲述。运行Task运行Task的两种方式,在上面我们已经提到过了,一种等待运行完毕,另一种则等待所有运行完毕。不过这里还有一种就是异步运行,跟使用多线程一样,调用Task对象中的Start()方法即可。

C# Task 的用法

其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观。代码更简洁了,使用Task来进行操作。可以跟线程一样可以轻松的对执行的方法进行控制。

顺便提一下,配合CancellationTokenSource类更为可以轻松的对Task操作的代码进行中途终止运行,会在后面的章节中讲述。

如果我们使用线程池来实现某几个方法运行,然后等待运行完成的大概会编写如下代码:

  1. using(ManualResetEventm1 =newManualResetEvent(false))
  2. using(ManualResetEventm2 =newManualResetEvent(false))
  3. {
  4. ThreadPool.QueueUserWorkItem(delegate
  5. {
  6. MyMethodA();
  7. m1.Set();
  8. });
  9. ThreadPool.QueueUserWorkItem(delegate
  10. {
  11. MyMethodB();
  12. m2.Set();
  13. });
  14. WaitHandle.WaitAll(newWaitHandle[]{m1,m2,});
  15. }

如果用Task类的话,相对就比较简单了,至少代码看起来很舒服。也就意味着维护也比较方便

  1. Taskt1 =Task.Factory.StartNew(delegate{MyMethodA();});
  2. Taskt2 =Task.Factory.StartNew(delegate{MyMethodB();});
  3. t1.Wait();
  4. t2.Wait();

上面的方法是一个一个的执行完毕,获取不是我们想要的,我们一般是想要他们一起同时执行,提高程序处理事情的效率。

  1. Taskt1 =Task.Factory.StartNew(delegate{MyMethodA();});
  2. Taskt2 =Task.Factory.StartNew(delegate{MyMethodB();});
  3. Task.WaitAll(t1,t2);

下面我们来简单介绍下Task的用法

创建 Task

创建Task有两种方式,一种是使用构造函数创建,另一种是使用 Task.Factory.StartNew 进行创建。如下代码所示

1.使用构造函数创建Task

  1. Taskt1 =newTask(MyMethod);

2.使用Task.Factory.StartNew 进行创建Task

  1. Taskt1 =Task.Factory.StartNew(MyMethod);

其实这两种方式都是一样的,Task.Factory 是对Task进行管理,调度管理这一类的。好学的伙伴们,可以深入研究。这不是本文的范畴,也许会在后面的文章细说。

运行 Task

运行Task的两种方式,在上面我们已经提到过了,一种等待运行完毕,另一种则等待所有运行完毕。不过这里还有一种就是异步运行,跟使用多线程一样,调用Task对象中的Start()方法即可。看看下面这个控制台示例。纯粹是Wait和AllWait的话,仅仅是等待。而不是执行。所以我们还需要调用Start()方法

  1. staticvoidMain(string[]args)
  2. {
  3. Taskt1 =newTask(MyMethod);
  4. t1.Start();
  5. Console.WriteLine("主线程代码运行结束");
  6. Console.ReadLine();
  7. }
  8. staticvoidMyMethod()
  9. {
  10. for(inti =0;i <5;i++)
  11. {
  12. Console.WriteLine(DateTime.Now.ToString());
  13. Thread.Sleep(1000);
  14. }
  15. }

运行效果如图

Task因为我们没有调用Wait 所以是异步执行的~

取消Task

我们一开始就描述了CancellationTokenSource这个对象对Task的取消运行。一般是用不到这个方法的,一般会正常的退出所运行的代码,如使用 bool IsExit 之类的来进行一个控制。而不是中途强制中断代码。

可以参考我的这篇文章:http://www.wxzzz.com/643.html

至于CancellationTokenSource控制Task,下一篇文章会进行详细的一个介绍。

Task的异常处理

因为Task中是异步执行,你也可以理解为跟多线程一样,具体错误捕获需要自己去捕获。很有意思的是Task的异常还会重新抛到Wait和AllWait中,我们可以进行方便的捕获这些异常。如下代码

  1. staticvoidMain(string[]args)
  2. {
  3. Taskt1 =newTask(MyMethod);
  4. t1.Start();
  5. t1.Wait();
  6. Console.WriteLine("主线程代码运行结束");
  7. Console.ReadLine();
  8. }
  9. staticvoidMyMethod()
  10. {
  11. thrownewException("Task异常测试");
  12. }

运行效果如图

Task Exception

获取 Task 的返回值

先看看代码

  1. Task<string>t1 =Task.Factory.StartNew(()=>"测试");
  2. t1.Wait();
  3. Console.WriteLine(t1.Result);
  4. Console.ReadLine();

返回值可以是任意的类型,因为是个泛型嘛~ 还是依然的非常简洁的代码。

免责声明:文章转载自《C# Task的用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vs 外部依赖项、附加依赖项以及如何添加依赖项目ubuntu 14.04 源码编译mysql-5.7.17下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

UOS怎么访问windows共享的文件夹

至此就共享成功了如何查看一个文件夹的绝对路径双击打开UOS桌面中的winshare文件夹,右键点击在终端中打开然后再输入pwd,记住这个路径,这个就是UOS中这个目录的绝对路径了...

VSCode, 当今最流行的免费开源代码编辑器,微软出品,必属精品

Visual Studio代码是一个轻量级但功能强大的源代码编辑器,可以在桌面上运行,可以用于Windows、MacOS和Linux。直接在编辑器中检查差异,暂时保存文件并提交。Visual Studio代码产品在初始操作中的内部代码控制可以通过编辑器内的SCM支持(包括丰富的Git集成)加快发布周期。用户界面-介绍VSCode编辑器的基本UI、命令和功能。...

IOS崩溃日志解析(crash log)

IOS的应用程序少不了crash,互联网统计分析工具友盟有一项目错误分析的功能,专门用于应用程序崩溃日志统计,最近研究友盟上统计到的崩溃日志,在此对崩溃日志做一个简单的总结。否则,应用将被iOS终止,并产生低内存崩溃报告。这样,我们去我们的dSYM文件看看我们的UUID是否和崩溃日志上的UUID一致,只有dSYM文件的UUID和崩溃日志上的UUID一致,我们...

eeprom AT24C512 i2c总线的特点 来自eeleader的博客

今天,我花了一天时间研究i2c总线的特性。因为我想用FPGA来设计i2c总线的操作时序i2c总线是一种常用的串行总线。我想操作串行eepromAT24C512。EEPROM的容量为512KBIT,内部按照每页128字节进行组织,共512页。第一点:芯片工作速度的选择:根据AT24C512手册,芯片可以在1.8V-5.0V的电压下工作;I2C总线的最大运行速度...

echarts折线图 鼠标移入改变小点显示样式

=undefined){res+=nameList[i].seriesName+':'+nameList[i].data+'%'+''}}res=res.split;returnres[0]+''+res[1];}}echarts折线图的鼠标移动上去小点显示样式修改tooltip:{trigger:'axis',formatter:function{varr...

nginx重启

方法二:在启动命令-c前加-t2、重启Nginx服务方法一:进入nginx可执行目录sbin下,输入命令./nginx-sreload即可方法二:查找当前nginx进程号,然后输入命令:kill-HUP进程号实现重启nginx服务...