多线程随笔二(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的要点就记录到这,有什么不足的地方之后再补充。

时间: 2024-10-17 21:44:40

多线程随笔二(Task)的相关文章

IOS中的多线程【二】— NSOperation和NSOperationQueue

NSOperationQueue是一套基于Objective-c语言的API. GCD与NSOperationQueue的优缺点: NSOperationQueue:比较安全 GCD:没有NSOperationQueue安全,但使用起来简单,快速,还提供了一些操控底层的方法.实际开发中还是以GCD为主. NSOperationQueue实现多线程流程 1.定义一个任务队列. 2.定义一个任务. 3.把任务添加到队列中.一旦任务被添加到队列中,任务会马上被调度执行. 任务队列(NSOperatio

Java入门——多线程(二)

Java入门——多线程(二) 线程的状态 要想实现多线程,必须在主线程中创建新的线程对象.任何线程一般具有5种状态. 创建状态:用构造方法创建一个线程对象之后,新的线程就处于该状态.已经有了相应的内存空间和其他资源和其他资源. 就绪状态:线程进入线程队列排队,等待CPU服务. 运行状态:CPU处理,自动调用run()方法. 阻塞状态:就是在执行过程中暂时挂起.原因有:人为挂起,CPU的决定,sleep(),suspend(),wait()等方法.只有当引起阻塞的原因被消除后,线程才能转入就绪状态

C#多线程之二:ManualResetEvent和AutoResetEvent

初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送.可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态.如果某个线程调用WaitOne方法

win32多线程 (二)线程同步之临界区 (critical sections)

所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码.你可能必须在程序的许多地方处理这一块可共享的资源.所有这些程序代码可以被同一个critical  section 保护起来.为了阻止问题发生,一次只能有一个线程获准进入critical  section 中.critical section 并不是核心对象.使用方法: CRITICAL_SECTION g_section; 1:初始化 InitializeCriticalSection(&g_section

[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 多线程高级应用

[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 多线程高级应用 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET多线程中的高级应用. 主要有在线程资源共享中的线程安全和线程冲突的解决方案:多线程同步,使用线程锁和线程通知实现线程同步. 1. ThreadStatic特性 特性:[ThreadStatic] 功能:指定静态字段在不同线程中拥有不同的值 在此之前,我们先看一个多线程的示例: 我们定义一个静态字段: static

浅解多线程(二)之和尚们的那些事儿

浅解多线程(一)之线程入门起步 本文链接 确定多线程的结束时间,thread的IsAlive属性 线程优先级,thread的ThreadPriority属性 线程通信之Monitor类 线程排队之Join 多线程互斥锁Mutex 信号量semaphore 确定多线程的结束时间,thread的IsAlive属性 在多个线程运行的背景下,了解线程什么时候结束,什么时候停止是很有必要的. 案例:老和尚念经计时,2本经书,2个和尚念,一人一本,不能撕破,最短时间念完,问老和尚们念完经书最短需要多长时间.

Java多线程(二)、线程的生命周期和状态控制(转)

Java多线程(二).线程的生命周期和状态控制 分类: javaSE综合知识点 2012-09-10 16:11 15937人阅读 评论(3) 收藏 举报 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadSt

.net 多线程 Thread ThreadPool Task

先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name"></param>private void DoSomeThing(string name){                 Console.WriteLine($"开始执行{name}, {Thread.CurrentThread.ManagedThreadId.ToString("

C# 多线程六之Task(任务)二

前面介绍了Task的由来,以及简单的使用,包括开启任务,处理任务的超时.异常.取消.以及如果获取任务的返回值,在回去返回值之后,立即唤起新的线程处理返回值.且如果前面的任务发生异常,唤起任务如果有效的处理异常等关于Task的知识.所以本文将介绍Task更多的用法和特性. 一.如果通过一个任务创建多个子任务. 1.Task支持一个任务,创建多个子任务,并且保持关联. static void Main(string[] args) { var parentTask = new Task<int[]>