一直都聽說了線程的好處和強大之處,但是一直沒有定下心來學習線程,工作中可能遇到的也比較少吧.最近開始學習線程,記錄一下自己的學習過程和心得.(注意:以下文章皆轉自他人文章,此處作爲例子.)
1.線程概念:
C#支持通過多線程並行地執行代碼,一個線程有它獨立的執行路徑,能夠與其它的線程同時地運行。
一個C#程序開始於一個單線程,這個單線程是被CLR和操作系統(也稱爲“主線程”)自動創建的,並具有多線程創建額外的線程。
2.當線程們引用了一些公用的目標實例的時候,他們會共享數據。
3.靜態字段提供了另一種在線程間共享數據的方式。
4.線程安全:當數據共享時候,造成資源衝突.解決方法:排它鎖
例如:
定義一個靜態鎖 static object locker = new object();
鎖:lock (locker)
{
if (!done)
{
代碼塊....
}
}
代碼以如此方式在不確定的多線程環境中被叫做線程安全。
5.臨時暫停(線程休眠/暫停):或阻止是多線程的協同工作,同步活動的本質特徵。等待一個排它鎖被釋放是一個線程被阻止的原因,另一個原因是線程想要暫停或Sleep一段時間
Thread.Sleep(TimeSpan.FromSeconds (30)); // Block for 30 seconds
一個線程也可以使用它的Join方法來等待另一個線程結束:
Thread t = new Thread(Go);
t.Start();
t.Join();
一個線程,一旦被阻止,它就不再消耗CPU的資源了。
一:創建和啓動線程:
方法1:使用Thread t = new Thread(方法名);
t.Start();
方法2:使用委託
定義委託:public delegate void ThreadStart();
Thread t = new Thread(new ThreadStart(方法名));
t.Start();
方法3:匿名委託
例:Thread t = new Thread(delegate () { Console.WriteLine("Hello!"); });
t.Start();
二:線程傳參:
public delegate void ParameterizedThreadStart(object obj);//可傳遞參數的委託
三:命名線程(Name屬性)
Thread ss = new Thread(Go);
ss.Name = "worker";
ss.Start();
四:前後臺線程:
Thread s = new Thread(Go);
s.Start();
s.IsBackground = true;
線程異常處理:
任何線程創建範圍內try/catch/finally塊,當線程開始執行便不再與其有任何關係。
例如:
public static void Main()
{
try
{
new Thread(Go).Start();
}
catch (Exception ex)
{
// 不會在這得到異常
Console.WriteLine("Exception!");
}
static void Go() { throw null; }
}
補救方法是在線程處理的方法內加入他們自己的異常處理:
public static void Main()
{
new Thread(Go).Start();
}
static void Go()
{
try
{
...
throw null; // 這個異常在下面會被捕捉到
...
}
catch (Exception ex)
{
記錄異常日誌,並且或通知另一個線程
我們發生錯誤
...
}