多线程随笔二(Task)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程随笔二(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的要点就记录到这,有什么不足的地方之后再补充。

以上是关于多线程随笔二(Task)的主要内容,如果未能解决你的问题,请参考以下文章

聊聊多线程哪一些事儿(task)之 二 延续操作

vbstask方法

C#多线程和异步——Task和async/await详解

多线程Task

C# 之 多线程 -- 任务概念以及使用示例 ( Task | TaskCompletionSource | Async | Await )

多线程-Taskawait/async