c#線程入門學習筆記(一)-概述與概念

一直都聽說了線程的好處和強大之處,但是一直沒有定下心來學習線程,工作中可能遇到的也比較少吧.最近開始學習線程,記錄一下自己的學習過程和心得.(注意:以下文章皆轉自他人文章,此處作爲例子.)

    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)
    {
        記錄異常日誌,並且或通知另一個線程
            我們發生錯誤
      ...
          }

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章