Task详解


 

C#线程篇---Task(任务)和线程池

QueueUserWorkItem:没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值

static void Main(string[] args)
{
	Console.WriteLine("主线程启动");
	//ThreadPool.QueueUserWorkItem(StartCode,5);
	new Task(StartCode, 5).Start();
	Console.WriteLine("主线程运行到此!");
	Thread.Sleep(1000);
}

private static void StartCode(object i)
{
	Console.WriteLine("开始执行子线程...{0}",i);
	Thread.Sleep(1000);//模拟代码操作    
}

TaskCreationOptions这个类型是一个枚举类型,传递一些标志来控制Task的执行方式(AttachedToParent标志,它总会得到Task采纳,因为它和TaskScheduler本身无关)

 

static void Main(string[] args)
{
	
	//1000000000这个数字会抛出System.AggregateException

	Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000000000);

	//可以现在开始,也可以以后开始 

	t.Start();

	//Wait显式的等待一个线程完成

	t.Wait();
   
	Console.WriteLine("The Sum is:"+t.Result);
}

private static Int32 Sum(Int32 i)
{
	Int32 sum = 0;
	for (; i > 0; i--)
		checked { sum += i; }
	return sum;
}

1. 在一个线程调用Wait方法时,系统会检查线程要等待的Task是否已经开始执行,如果任务正在执行,那么这个Wait方法会使线程阻塞,知道Task运行结束为止。

2. 为什么要调用Wait或者Result?或者一直不查询Task的Exception属性?你的代码就永远注意不到这个异常的发生,如果不能捕捉到这个异常,垃圾回收时,抛出AggregateException,进程就会立即终止,这就是“牵一发动全身”,莫名其妙程序就自己关掉了,谁也不知道这是什么情况。所以,必须调用前面提到的某个成员,确保代码注意到异常,并从异常中恢复。悄悄告诉你,其实在用Result的时候,内部会调用Wait。 

 

 三:任务工厂

 Task还支持任务工厂的概念。任务工厂支持多个任务之间共享相同的状态,如取消类型CancellationTokenSource就是可以被共享的。通过使用任务工厂,可以同时取消一组任务:

staticvoid Main(string[] args)
{
	CancellationTokenSource cts =new CancellationTokenSource();
	//等待按下任意一个键取消任务
	TaskFactory taskFactory =new TaskFactory();
	Task[] tasks =new Task[]
		{
			taskFactory.StartNew(() => Add(cts.Token)),
			taskFactory.StartNew(() => Add(cts.Token)),
			taskFactory.StartNew(() => Add(cts.Token))
		};
	//CancellationToken.None指示TasksEnded不能被取消
	taskFactory.ContinueWhenAll(tasks, TasksEnded, CancellationToken.None);
	Console.ReadKey();
	cts.Cancel();
	Console.ReadKey();
}

staticvoid TasksEnded(Task[] tasks)
{
	Console.WriteLine("所有任务已完成!");
}

任务开始……
任务开始……
任务开始……
所有任务已完成(取消)!  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM