多線(xiàn)程編程筆記(二)
線(xiàn)程池
用線(xiàn)程池編寫(xiě)多線(xiàn)程應用一般步驟:
1、編寫(xiě)工作任務(wù):將所有的工作任務(wù)泛放在一個(gè)符合WaitCallback接口的函數中
public static void MyAsyncOperation(object state)
{
//...
//要完成的工作任務(wù)
}
一般通過(guò)state傳入一個(gè)同步對象
2、往線(xiàn)程池中添加工作項
ThreadPool.QueueUserWorkItem(new WaitCallback(MyAsyncOperation),asyncOpIsDone);
此時(shí)將第2個(gè)參數asyncOpIsDone作為MyAsyncOperation的state參數執行該委托實(shí)例。
3、和工作線(xiàn)程通信
比較典型的做法是主線(xiàn)程傳入一個(gè)同步對象到工作線(xiàn)程,工作線(xiàn)程在完成任務(wù)后利用傳入的同步對象通知主線(xiàn)程。
線(xiàn)程池中的線(xiàn)程是按需創(chuàng )建達到。公共運行庫根據線(xiàn)程池中工作任務(wù)的多少創(chuàng )建合適的線(xiàn)程來(lái)處理工作任務(wù)。
注意:為了減輕系統的負擔,應盡量使每個(gè)工作任務(wù)盡快的結束。對于那些需要大量CPU時(shí)間的工作任務(wù),可利用Thread類(lèi)創(chuàng )建自由線(xiàn)程來(lái)執行。
例程:
using System;
using System.Threading;
namespace AsyncMethod
{
class App
{
public static void MyAsyncOperation(object state)
{
Console.WriteLine("工作任務(wù)");
//....
Console.WriteLine("睡眠5秒");
Thread.Sleep(5000);
((AutoResetEvent)state).Set();//將指定事件的狀態(tài)設置為終止。指示工作認為已完成
Console.WriteLine("工作任務(wù)結束");
}
public static void Main()
{
Console.WriteLine("主線(xiàn)程進(jìn)行異步調用");
AutoResetEvent asyncOpIsDone = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(MyAsyncOperation),asyncOpIsDone);
Console.WriteLine("主線(xiàn)程執行其他任務(wù)");
//....
Console.WriteLine("主線(xiàn)程等待工作任務(wù)結束");
asyncOpIsDone.WaitOne();//阻塞當前線(xiàn)程,直到當前的 WaitHandle 收到信號。
}
}
}
//下面程序,工作線(xiàn)程和主線(xiàn)程均在同一個(gè)應用域中,公共運行庫創(chuàng )建了2個(gè)工作線(xiàn)程來(lái)完成工作線(xiàn)程池中的2個(gè)任務(wù)。
using System;
using System.Threading;
namespace demoThreadPool
{
class App
{
public static void MyWorkItem(object state)
{
Console.WriteLine("\n當前線(xiàn)程的代碼:{0}",Thread.CurrentThread.GetHashCode().ToString());
Console.WriteLine("當前應用域的名稱(chēng)為:{0}",AppDomain.CurrentDomain.FriendlyName);
Thread.Sleep(1000);
((AutoResetEvent)state).Set();
}
public static void demoThreadPool()
{
Console.WriteLine("當前線(xiàn)程的代碼:{0}",Thread.CurrentThread.GetHashCode().ToString());
Console.WriteLine("當前應用域的名稱(chēng)為:{0}",AppDomain.CurrentDomain.FriendlyName);
AutoResetEvent asyncOpIsDone = new AutoResetEvent(false);
AutoResetEvent asyncOpIsDone2 = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkItem),asyncOpIsDone);
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkItem),asyncOpIsDone2);
WaitHandle[] handles= new WaitHandle[2];
handles[0] = asyncOpIsDone;
handles[1] = asyncOpIsDone2;
WaitHandle.WaitAll(handles);//此語(yǔ)句也可以用下面語(yǔ)句代替
//handles[0].WaitOne();
//handles[1].WaitOne();
}
public static void Main()
{
demoThreadPool();
}
}
}
方法說(shuō)明:
public AutoResetEvent(
bool initialState
);
//用一個(gè)指示是否將初始狀態(tài)設置為終止的布爾值初始化 AutoResetEvent 類(lèi)的新實(shí)例。
//initialState
//如果為 true,則將初始狀態(tài)設置為終止;如果為 false,則將初始狀態(tài)設置為非終止。
//使用 AutoResetEvent 類(lèi)可以使某個(gè)線(xiàn)程等待,直到某個(gè)事件通過(guò)調用 AutoResetEvent.Set 將其置于已發(fā)信號的狀態(tài)為止。與 ManualResetEvent 不同,AutoResetEvent 在單個(gè)等待線(xiàn)程被釋放后由系統自動(dòng)重置為未發(fā)信號的狀態(tài)。如果沒(méi)有任何線(xiàn)程正在等待,則該事件對象的狀態(tài)將保持已發(fā)信號的狀態(tài)。AutoResetEvent 與 Win32 CreateEvent 調用相對應,并將 bManualReset 參數指定為 false。
//還要注意WaitOne,WaitAll,WaitAny的用法
<.net核心技術(shù)-原理與架構>
聯(lián)系客服