多线程随笔二(Task)
Task类是.net 4.0新加进来的特性,对原有的Thread,ThreadPool做了进一步的封装,使得.net平台上的多线程编程变得更加方便。废话不多说,进入正题。
一. Task启动
Task启动主要有以下几种用法:
1.构造Task对象,启动Task
1 Task myTask = new Task(DoSomething); 2 myTask.Start();
2.通过Task.Factory启动Task
Task second = Task.Factory.StartNew(DoSomething);
两者的区别在于Task创建之后需要通过Start方法启动,而Task.Factory的StartNew方法直接就启动了该Task,无需通过手动方法启动。
参数一般为一个Delegate,Action或者Lambda表达式,告诉该Task需要执行什么方法。
此外Task跟Task.Factory还有两个带返回值的版本,用于带返回值的任务,如下:
Task<MyClass> myTask = new Task<MyClass>(()=> new MyClass()); myTask.Start();
Task<MyClass> second = Task.Factory.StartNew(() => new MyClass());
二. Task返回值(泛型版本才有返回值)
可以通过以下方法获取返回值(注意,此操作会阻塞当前线程):
var result = myTask.Result;
如果想要获取线程当前的状态,可以调用Task的Status属性,该属性是一个枚举值。
三. Task结束
如果需要手动控制Task的结束,微软提供了CancellationTokenSource令牌类,使用方式如下:
CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); Task<MyClass> myTask = new Task<MyClass>(() =>{Thread.Sleep(5000);return new MyClass();},cancelTokenSource.Token); myTask.Start(); cancelTokenSource.Cancel();
CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); Task<MyClass> myTask = Task.Factory.StartNew(() => { Thread.Sleep(5000); return new MyClass(); }, cancelTokenSource.Token); cancelTokenSource.Cancel();
通过Cancel方法结束目标Task。
关于Task的要点就记录到这,有什么不足的地方之后再补充。