以下為他人轉載。這樣的材料太多了。其實仔細看材料很簡單。
參考資料中的內容非常詳細。
壹、線程簡介
通常C#程序只有壹個線程。這個線程從主方法的執行開始,在主方法的執行結束時結束。Main直接或間接執行的每個命令都是由默認線程(或主線程)執行的,當Main返回時這個線程也會被終止。但是,您可以創建工作線程來與主線程並行執行代碼。這些線程通常被稱為“工作線程”。
輔助線程可用於執行耗時或時間關鍵的任務,而不會占用主線程。例如,在服務器應用程序中,工作線程通常用於響應傳入的請求,而不等待前面的請求完成。工作線程還可以用於執行桌面應用程序中的“後臺”任務,以便主線程(用於驅動用戶界面元素)保持對用戶操作的響應。
多線程解決了吞吐量和響應性的問題,但同時也帶來了資源享用的問題,比如死鎖和爭用狀態。多線程特別適合需要不同資源的任務,例如文件句柄和網絡連接。將多個線程分配給單個資源可能會導致同步問題,線程會被頻繁阻塞以等待其他線程,這與使用多線程的初衷背道而馳。
常見的策略是使用輔助線程來執行耗時或時間關鍵的任務,並且不會占用其他線程使用的大量資源。事實上,程序中的壹些資源必須被多個線程訪問。考慮到這些情況,系統。線程命名空間提供了用於同步線程的類。這些類包括互斥、監控、互鎖、自動重置事件和手動重置事件。
您可以使用這些類中的部分或全部來同步多個線程的活動,但是C#語言提供了壹些多線程支持。例如,C#中的Lock語句通過隱式使用Monitor來提供同步。
第二,線程的生命周期
第三,與線程相關的類
和C#相關的類都在系統裏。線程命名空間,它提供了壹些支持多線程編程的類和接口。除了同步線程活動和訪問數據的類(互斥、監控、互鎖、自動重置事件等)。),這個命名空間還包含壹個ThreadPool類(允許用戶使用系統提供的線程池)和壹個Timer類(在線程池線程上執行回調方法)。
1.線程:創建和控制線程,設置它們的優先級並獲取它們的狀態。最常用的方法如下:
Sleep():在指定的毫秒數內阻塞當前線程。
Abort (): ThreadAbortException在調用此方法的線程上引發,以啟動終止此線程的進程。調用此方法通常會終止線程。
Join():阻塞調用線程,直到線程終止。
Start():使線程能夠按計劃執行。
註意Suspend()是壹個掛起的線程,Resume()是壹個繼續掛起的線程。這兩種方法都有風險,不推薦。詳情請參考MS的相關文檔。
Thread類的通用屬性如下:
CurrentThread:獲取當前運行的線程。
IsAlive:獲取壹個值,該值指示當前線程的執行狀態。
Name:獲取或設置線程的名稱。
Priority:獲取或設置指示線程調度優先級的值。
ThreadState:獲取壹個包含當前線程狀態的值。
2.ThreadPool:提供壹個線程池,可用於發送工作項、處理異步I/O、代表其他線程等待以及處理計時器。
BindHandle:將操作系統句柄綁定到線程池。
GetAvailableThreads:檢索GetMaxThreads方法返回的最大線程池數與當前活動線程數之間的差值。
GetMaxThreads:檢索可以同時處於活動狀態的線程池請求的數量。所有大於該數量的請求將壹直排隊,直到線程池線程可用。
GetMinThreads:在新的請求預測中檢索由線程池維護的空閑線程的數量。
QueneUserWorkItem:將方法排隊等待執行。當線程池線程可用時,執行此方法。
RegisterWaitForSingleObject:註冊等待WaitHandle的委托。
UnsafeQueueUserWorkItem:註冊壹個正在等待WaitHandle的委托。
SetMaxThreads:為壹個線程池設置可以同時處於活動狀態的請求數。所有大於該數量的請求將壹直排隊,直到線程池線程可用。
四。示例及其解釋
使用系統;
使用系統。穿線;
公共階級工人
{
//線程啟動時會調用這個方法。
public void DoWork()
{
而(!_shouldStop) //如果線程正在運行,則打印信息。
{
控制臺。WriteLine("工作線程:正在工作...");
}
控制臺。WriteLine("工作線程:正常終止。");
}
公共void RequestStop()
{
_ shouldStop = true
}
//關鍵字volatile用來提醒編譯器這個數據成員將被多個線程訪問。
私有可變bool _ shouldStop//應該停止了。
}
公開課程
{
靜態空幹管()
{
//創建壹個線程對象。這不是線程的開始。
Worker Worker object = new Worker();
//在此定義壹個新線程。註意,這裏沒有使用ThreadStart委托。
//此外,構造函數接受對象的方法名。
Thread workerThread =新線程(workerObject。DoWork);
//這是線程的真正開始。
工人線程。start();
控制臺。WriteLine("主線程:工作線程啟動...");
//循環,直到線程被激活。thread的IsAlive屬性指示線程是否處於活動狀態。
而(!工人線程。isa live);
//暫停主線程1毫秒,以允許工作線程完成其工作。
線程。睡眠(1);
//需要工作線程自動停止。
工作對象。request stop();
//使用Join方法阻塞當前線程,直到對象的線程終止workerThread。join();
控制臺。WriteLine("主線程:工作線程已終止。");
}
}