这篇文章介绍了C#并行库Task类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务。对于将一个任务放进线程池
ThreadPool.QueueUserWorkItem(A);
这段代码用Task来实现的话,方式如下:
Task.Create(A);
这两端代码的使用和实现的功能都十分相似。但和TheadPool相比,Task有着更多的功能,更加方便我们使用。
Task.WaitAll()该函数的功能是等待多个任务等待任务完成,这在线程同步时经常需要用到。
假如我们要创建三个任务,并等待它们完成。这个功能用TheadPool实现如下:
using (ManualResetEvent mre1 = new ManualResetEvent(false))
using (ManualResetEvent mre2 = new ManualResetEvent(false))
using (ManualResetEvent mre3 = new ManualResetEvent(false))
{
ThreadPool.QueueUserWorkItem(delegate
{
A();
mre1.Set();
});
ThreadPool.QueueUserWorkItem(delegate
{
B();
mre2.Set();
});
ThreadPool.QueueUserWorkItem(delegate
{
C();
mre3.Set();
});
WaitHandle.WaitAll(new WaitHandle[] { mre1, mre2, mre3 });
}
用Task类实现起来就相对简单多了:
Task t1 = Task.Create(delegate { A(); });
Task t2 = Task.Create(delegate { B(); });
Task t3 = Task.Create(delegate { C(); });
t1.Wait();
t2.Wait();
t3.Wait();
或者我们还可以这么写:
Task t1 = Task.Create(delegate { A(); });
Task t2 = Task.Create(delegate { B(); });
Task t3 = Task.Create(delegate { C(); });
Task.WaitAll(t1, t2, t3);
Task.Cancel和Task.CancelAndWait这个是一个成员函数,用于取消已经创建的Task,如果该Task正在执行中,该函数并不终止Task的执行,只是将IsCanceled属性设置为true。
Task.Cancel和Task.CancelAndWait的区别在于:Task.CancelAndWait除了取消Task外,还将等待该Task执行完成(如果该Task在执行中)。Task.ContinueWith该成员函数的作用是在执行完Task后,再执行一个后续操作。这也是一个比较有用的功能,由于比较简单,就不介绍了。
除了上述介绍的几个方法外,Task还有一些比较有用的属性和方法,也非常简单,直接参看其说明文档即可。
TaskManager和TaskManagerPolicy
这两个类主要是对Task的策略进行管理,主要管理的属性包括:最少处理Task的处理器个数、理想处理Task的处理器个数、理想的处理线程数及优先级几个属性。
在Task中使用TaskManager非常简单,只要在创建Task时将manager传入构造函数中即可。如下例所示:
var manager = new TaskManager(new TaskManagerPolicy(1, 1,1));
var t1 = Task.Create(x => Thread.Sleep(2000), manager);
var t2 = Task.Create(x => Thread.Sleep(2000), manager);
var start = DateTime.Now;
Task.WaitAll(t1, t2);
var end = DateTime.Now;
Console.WriteLine(end-start);
在这里我将处理线程个数设置了为1,这样的话,只有一个线程来处理Task,执行这两个Task总共花费的时间为4秒;而在使用默认manager时候,这两个任务是并发执行的,只需要两秒即可执行完成。
异常处理
当Task在执行过程中发生异常时,该异常会在Wait或WaitAll函数中重新throw。可以通过Task的Exception属性来获取发生的异常。
var t1 = Task.Create(x => { throw new Exception("t1 error occor"); });
var t2 = Task.Create(x => { throw new Exception("t2 error occor"); });
try
{
Task.WaitAll(t1, t2);
}
catch(Exception)
{
Console.WriteLine(t1.Exception.InnerException.Message);
Console.WriteLine(t2.Exception.InnerException.Message);
}
另外,顺带简单的介绍一下Future类,这个类的功能和用法和Task非常相似,完全可以看做一个带返回值的Task。示例如下:
var f1 = Future.Create(() => 3);
f1.Wait();
Console.WriteLine(f1.Value);
到此这篇关于C#并行库Task类的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持得得之家。
本文标题为:C#并行库Task类介绍
基础教程推荐
- 一个读写csv文件的C#类 2022-11-06
- C# windows语音识别与朗读实例 2023-04-27
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- ZooKeeper的安装及部署教程 2023-01-22
- C#控制台实现飞行棋小游戏 2023-04-22
- C# List实现行转列的通用方案 2022-11-02
- C#类和结构详解 2023-05-30
- C# 调用WebService的方法 2023-03-09
- winform把Office转成PDF文件 2023-06-14
- unity实现动态排行榜 2023-04-27