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