日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#多线程编程(转)

發布時間:2025/5/22 C# 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#多线程编程(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、使用線程的理由

1、可以使用線程將代碼同其他代碼隔離,提高應用程序的可靠性。

2、可以使用線程來簡化編碼。

3、可以使用線程來實現并發執行。

二、基本知識

1、進程與線程:進程作為操作系統執行程序的基本單位,擁有應用程序的資源,進程包含線程,進程的資源被線程共享,線程不擁有資源。

2、前臺線程和后臺線程:通過Thread類新建線程默認為前臺線程。當所有前臺線程關閉時,所有的后臺線程也會被直接終止,不會拋出異常。

3、掛起(Suspend)和喚醒(Resume):由于線程的執行順序和程序的執行情況不可預知,所以使用掛起和喚醒容易發生死鎖的情況,在實際應用中應該盡量少用。

4、阻塞線程:Join,阻塞調用線程,直到該線程終止。

5、終止線程:Abort:拋出 ThreadAbortException 異常讓線程終止,終止后的線程不可喚醒。Interrupt:拋出 ThreadInterruptException 異常讓線程終止,通過捕獲異常可以繼續執行。

6、線程優先級:AboveNormal BelowNormal Highest Lowest Normal,默認為Normal。

三、線程的使用

線程函數通過委托傳遞,可以不帶參數,也可以帶參數(只能有一個參數),可以用一個類或結構體封裝參數。

namespace Test {class Program{static void Main(string[] args){Thread t1 = new Thread(new ThreadStart(TestMethod));Thread t2 = new Thread(new ParameterizedThreadStart(TestMethod));t1.IsBackground = true;t2.IsBackground = true;t1.Start();t2.Start("hello");Console.ReadKey();}public static void TestMethod(){Console.WriteLine("不帶參數的線程函數");}public static void TestMethod(object data){string datastr = data as string;Console.WriteLine("帶參數的線程函數,參數為:{0}", datastr);}} }

四、線程池

由于線程的創建和銷毀需要耗費一定的開銷,過多的使用線程會造成內存資源的浪費,出于對性能的考慮,于是引入了線程池的概念。線程池維護一個請求隊列,線程池的代碼從隊列提取任務,然后委派給線程池的一個線程執行,線程執行完不會被立即銷毀,這樣既可以在后臺執行任務,又可以減少線程創建和銷毀所帶來的開銷。

線程池線程默認為后臺線程(IsBackground)。

namespace Test {class Program{static void Main(string[] args){//將工作項加入到線程池隊列中,這里可以傳遞一個線程參數ThreadPool.QueueUserWorkItem(TestMethod, "Hello");Console.ReadKey();}public static void TestMethod(object data){string datastr = data as string;Console.WriteLine(datastr);}} }

五、Task類

使用ThreadPool的QueueUserWorkItem()方法發起一次異步的線程執行很簡單,但是該方法最大的問題是沒有一個內建的機制讓你知道操作什么時候完成,有沒有一個內建的機制在操作完成后獲得一個返回值。為此,可以使用System.Threading.Tasks中的Task類。

構造一個Task<TResult>對象,并為泛型TResult參數傳遞一個操作的返回類型。

namespace Test {class Program{static void Main(string[] args){Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000);t.Start();t.Wait();Console.WriteLine(t.Result);Console.ReadKey();}private static Int32 Sum(Int32 n){Int32 sum = 0;for (; n > 0; --n)checked{ sum += n;} //結果太大,拋出異常return sum;}} }

一個任務完成時,自動啟動一個新任務。
一個任務完成后,它可以啟動另一個任務,下面重寫了前面的代碼,不阻塞任何線程。

namespace Test {class Program{static void Main(string[] args){Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000);t.Start();//t.Wait();Task cwt = t.ContinueWith(task => Console.WriteLine("The result is {0}",t.Result));Console.ReadKey();}private static Int32 Sum(Int32 n){Int32 sum = 0;for (; n > 0; --n)checked{ sum += n;} //結果溢出,拋出異常return sum;}} }

六、委托異步執行

委托的異步調用:BeginInvoke() 和 EndInvoke()

namespace Test {public delegate string MyDelegate(object data);class Program{static void Main(string[] args){MyDelegate mydelegate = new MyDelegate(TestMethod);IAsyncResult result = mydelegate.BeginInvoke("Thread Param", TestCallback, "Callback Param");//異步執行完成string resultstr = mydelegate.EndInvoke(result);}//線程函數public static string TestMethod(object data){string datastr = data as string;return datastr;}//異步回調函數public static void TestCallback(IAsyncResult data){Console.WriteLine(data.AsyncState);}} }

七、線程同步

  1)原子操作(Interlocked):所有方法都是執行一次原子讀取或一次寫入操作。

  2)lock()語句:避免鎖定public類型,否則實例將超出代碼控制的范圍,定義private對象來鎖定。

  3)Monitor實現線程同步

    通過Monitor.Enter() 和 Monitor.Exit()實現排它鎖的獲取和釋放,獲取之后獨占資源,不允許其他線程訪問。

    還有一個TryEnter方法,請求不到資源時不會阻塞等待,可以設置超時時間,獲取不到直接返回false。

  4)ReaderWriterLock

    當對資源操作讀多寫少的時候,為了提高資源的利用率,讓讀操作鎖為共享鎖,多個線程可以并發讀取資源,而寫操作為獨占鎖,只允許一個線程操作。

  5)事件(Event)類實現同步

    事件類有兩種狀態,終止狀態和非終止狀態,終止狀態時調用WaitOne可以請求成功,通過Set將時間狀態設置為終止狀態。

    1)AutoResetEvent(自動重置事件)

    2)ManualResetEvent(手動重置事件)

  6)信號量(Semaphore)

      信號量是由內核對象維護的int變量,為0時,線程阻塞,大于0時解除阻塞,當一個信號量上的等待線程解除阻塞后,信號量計數+1。

      線程通過WaitOne將信號量減1,通過Release將信號量加1,使用很簡單。

  7)互斥體(Mutex)

      獨占資源,用法與Semaphore相似。

?  8)跨進程間的同步

      通過設置同步對象的名稱就可以實現系統級的同步,不同應用程序通過同步對象的名稱識別不同同步對象。

?

?

作者:阿凡盧 出處:http://www.cnblogs.com/luxiaoxun/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

轉載于:https://www.cnblogs.com/yellowcool/p/7444336.html

總結

以上是生活随笔為你收集整理的C#多线程编程(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。