Task类的学习

一、Task启动
1、Task类在System.Threading.Tasks命名空间下面
2、开始一个Task最简单的方法是Task.Run(.net 4.5,4.0的时候是Task.Factory.StartNew).
3、使用方法是传入一个委托即可。
4、Task默认使用线程池,也就是后台线程。当主线程结束时,创建的所有task都会结束。
5、Task.Run返回一个Task对象,可以用它来监视其过程。在Task.Run之后,不需要调用Start,因为该方法创建的是热任务,会直接运行。可以通过Task的构造函数创建冷任务,一般很少这么做。
6、可以通过Task的Status属性来跟踪task的执行状态。

二、Wait
1、调用task的Wait方法,会进行主线程阻塞,直至task执行完成。相当于thread的Join方法。
2、Wait防范可以指定一个超时时间,和一个取消令牌来提前结束等待。

三、LongRunning
1、默认情况下,CLR在线程池中运行Task,非常适合短时间运行的Compute-Bound类工作。
2、针对长时间运行的任务或阻塞操作,可以不适用线程池(使用longRuning)。
3、如果运行多个long-running tasks(尤其是其中有处于阻塞状态的),会严重影响性能,这时有比TaskCreationOptions.LongRunning更好的方法:
a、如果任务是IO-Bound,TaskCompletionSource和异步函数可以使用回调(Coninuations)代替线程来实现并发。
b、如果任务是Compute-Bound,生产者/消费者队列允许对任务的并发性进行限流,避免其他线程或进程饿死。

四、Task的返回值
1、Task有一个范型子类Task,它允许返回一个返回值。
2、使用Func委托或兼容的Lambda表达式来调用Task.Run可以得到Task。
例1:

Task<int> task = Task.Run(()=>
{
	return 3;
});
int result = task.Result;

例2:

Task<int> primeNumberTask = Task.Run(()=>
{
	Enumerable.Range(2,3000000).Count(n=>Enumerable.Range(2,(int)Math.Sqrt(n)-1).All(i => n % i > 0)));
});
int result = primeNumberTask.Result;

3、可以通过Result属性来获得返回的结果。如果task没有完成,访问Result属性会阻塞线程直到该task完成.
4、Task可以看作“许诺/未来”(promise/future),它里面包裹着一个Result,稍后可用。
5、在CTP版本的时候,Task实际叫做Future.

Task的异常
1、与Thread不一样,Task可以很方便的传播异常。如果task里抛出了一个未处理的异常,那么这个异常会抛给:
a、调用了Wait的地方
b、访问了Task的Result属性的地方。
例:

Task task = Task.Run(()=>{thorw null;});
try
{
	task.Wait();
}
catch(AggregateException aex)
{
	if(aex.InnerExcepption is nullReferenceException)
	{
		Console.WriteLine("Null");
	}
	else
	{
		throw;
	}
}

2、CLR将异常包裹在AggregateException里,以便在并行编程场景中发挥很好的作用。
3、可以不重新抛出异常,通过Task的IsFaulted和IsCanceled属性也可以检测出Task是否发生了故障。
a、如果两个熟悉都返回false,则没有错误发生。
b、如果IsCanceled为true,说明一个OperationCanceledException为该Task抛出了。
c、如果IsFaulted为true,说明另一个类型的异常被抛出了,二Exception属性也将指明错误。
4、自治的Task是指不通过调用Wait方法,Result属性或Continuation进行会合的任务。针对自治Task,需要显示的处理异常,避免出面未处观察到的异常。可以通过全局的TaskScheduler.UnobservedTaskException来订阅未观察到的异常。
5、未观察到的异常有细微差别:
a、使用超时进行等待的Task,如果超时后发生故障,那么它将产生未观察到的异常。
b、在Task发生异常后,如果访问Task的Exception属性,那么该异常是已观察的异常。

你可能感兴趣的:(学习)