程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> C#多線程總結,

C#多線程總結,

編輯:關於.NET

C#多線程總結,


線程的創建

Thread

 1             var thread = new Thread(() => 
 2             {
 3                 Console.WriteLine("thread start:" + Thread.CurrentThread.ManagedThreadId);  //ManagedThreadId為線程的id
 4                 Thread.Sleep(10000);
 5                 Console.WriteLine("thread end:" + Thread.CurrentThread.ManagedThreadId);
 6             });
 7             //設置是否為後台線程:
 8             //  前台線程:所有前台線程執行結束後,該進程才會關閉退出(主線程和通過Thread類創建的線程默認是前台線程)
 9             //  後台線程:所有前台結束後,後台線程就會立即結束(不管是否執行完成都會結束)
10             thread.IsBackground = true;
11             thread.Start();//開啟線程,不傳遞參數
12 
13             //傳遞參數的
14             var thread1 = new Thread(param => 
15             {
16                 Thread.Sleep(3000);
17                 Console.WriteLine(param);
18             });
19             thread1.Start("val");
20             thread1.Join(); //等待線程執行完成(使當前調用Join的線程阻塞)
21             //暫停和恢復線程都標志為已過時了,不建議使用
22             //thread1.Suspend();  
23             //thread1.Resume();
24             //設置線程的優先級,注意:在NT內核的Windows平台上建議不使用優先級來影響線程優先調度的行為,因為根本沒法預期一個高優先級的線程必然會先於一個低優先級的線程執行,所以也就失去了控制線程調度的價值
25             //thread1.Priority = ThreadPriority.Highest; 
26             //thread1.Abort();    //暴力的終止線程,一般不建議使用

Sleep/ SpinWait

Sleep與SpinWait的區別:

使用Thread.Sleep()會導致等待過於進行切換,等待時間不准確,而且會由用戶模式切換到內核模式;使用SpinWait(一個輕量同步類型(結構體))來進行等待的處理,等待過程中會使用自旋等待,從而避免線程頻繁的用戶模式和內核模式切換,一般用於短時的等待操作:

1             //參數一為Func<bool>,就是自旋時的循環體,直到返回true或者過時為止
2             SpinWait.SpinUntil(() =>
3             {
4                 Console.WriteLine("Spin Waiting");
5                 return false;
6             }, 1000);
7             SpinWait.SpinUntil(() => false, 1000); //返回false會進入等待狀態,類似於Thread.Sleep()等待,但是會盤旋CPU周期,在短期內等待事件准確度都高於Sleep 
8             SpinWait.SpinUntil(() => true, 1000);  //返回true會自動跳出等待狀態,不再休眠,繼續執行下面的代碼

使用SpinWait做一些多線程的流程控制

 1             int i = 0;
 2             Task.Run(() => 
 3             {
 4                 Thread.Sleep(1000); //模擬一些操作
 5                 Interlocked.Increment(ref i);
 6             });
 7             Task.Run(() =>
 8             {
 9                 Thread.Sleep(1000); //模擬一些操作
10                 SpinWait.SpinUntil(() => i == 1);    //等待1完成
11                 Thread.Sleep(1000); //模擬一些操作
12                 Interlocked.Increment(ref i);
13             });
14             SpinWait.SpinUntil(() => i == 2);    //等待所有流程完成
15             Console.WriteLine("Completed!");

ThreadPool

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved