C# 初步學習執行緒
static void Main(string[] args)
{
Thread t = new Thread(PrintNumbersWithDelay);
t.Start();
PrintNumbers();
Console.ReadKey();
}
static void PrintNumbers()
{
Console.WriteLine("Starting...");
for (int i = 1; i < 10; i++)
{
Console.WriteLine("--" + i);
}
}
static void PrintNumbersWithDelay()
{
Console.WriteLine("Starting1...");
Thread.Sleep(TimeSpan.FromMilliseconds(1));
for (int i = 1; i < 10 ; i++)
{
Console.WriteLine("-" + i);
}
}
執行緒建立–>就緒–>執行–>阻塞–>就緒–>執行–>退出
執行緒優先順序:
5、Lowest,
4、BelowNormal,
3、Normal,
2、AboveNormal,
1、Highest,
前臺執行緒和後臺執行緒的區別:
程序會等待所有的前臺執行緒完成後再結束工作,但是如果只剩下後臺執行緒,則會直接結束工作。
如果程式定義了一個不會完成的前臺執行緒,主程式並不會正常結束。
Mutex:互斥量
具名的互斥量是全域性的作業系統物件,可以作為程序間的同步。
SemaphoreSlim(Semaphore輕量級版本):
該類限制了同時訪問同一個資源的執行緒數量。不使用Windows核心物件,不支援程序間同步。
Semaphore:可跨程序同步。
AutoResetEvent和ManualResetEvent:
在.Net多執行緒程式設計中,AutoResetEvent和ManualResetEvent這兩個類經常用到, 他們的用法很類似,但也有區別。Set方法將訊號置為傳送狀態,Reset方法將訊號置為不傳送狀態,WaitOne等待訊號的傳送。可以通過建構函式的引數值來決定其初始狀態,若為true則非阻塞狀態,為false為阻塞狀態。如果某個執行緒呼叫WaitOne方法,則當訊號處於傳送狀態時,該執行緒會得到訊號, 繼續向下執行。其區別就在呼叫後,AutoResetEvent.WaitOne()每次只允許一個執行緒進入,當某個執行緒得到訊號後,AutoResetEvent會自動又將訊號置為不傳送狀態,則其他呼叫WaitOne的執行緒只有繼續等待.也就是說,AutoResetEvent一次只喚醒一個執行緒;而ManualResetEvent則可以喚醒多個執行緒,因為當某個執行緒呼叫了ManualResetEvent.Set()方法後,其他呼叫WaitOne的執行緒獲得訊號得以繼續執行,而ManualResetEvent不會自動將訊號置為不傳送。也就是說,除非手工呼叫了ManualResetEvent.Reset()方法,則ManualResetEvent將一直保持有訊號狀態,ManualResetEvent也就可以同時喚醒多個執行緒繼續執行。
EventWaitHandle:
AutoResetEvent和ManualResetEvent的基類,可跨程序同步同步。