C# 執行緒池簡單用法
阿新 • • 發佈:2019-02-01
最簡單的單執行緒運用是直接建立一個Thread物件再呼叫satrt(),此方法丟擲一個執行緒後將不再管它,讓其自生自滅...
private void MessageShow(string msg, string title, MessageBoxIcon boxIcon) { //為防阻塞,多執行緒彈出提示框 new Thread(() => { MessageBox.Show(msg, title, MessageBoxButtons.OK, boxIcon); }).Start(); //MessageBox.Show(msg, title, MessageBoxButtons.OK, boxIcon); } 或者 //方法中不準有返回值或形參 Thread thread = new Thread(MessageShow); thread.Start(); private void MessageShow() { MessageBox.Show(msg); }
當有多個任務,並且要等待任務結束再進行其他操作時,用執行緒池來管理,將操作放入執行緒池陣列,如果不確定任務的數量可用list暫時儲存,傳入時再轉成陣列即可.
List<ManualResetEvent> _ManualEvents = new List<ManualResetEvent>();//執行緒池 for (int i = 0; i < 5; i++) { ManualResetEvent mre = new ManualResetEvent(false); _ManualEvents.Add(mre); ThreadPool.QueueUserWorkItem(MessageShow, mre);//由執行緒池管理 } //確保list有任務,否則報錯 if (_ManualEvents.Count > 0) WaitHandle.WaitAll(_ManualEvents.ToArray());//無限等待
單個任務
ManualResetEvent ManualEvent = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(MessageShow, ManualEvent);//由執行緒池管理
ManualEvent.WaitOne();//無限等待,只有一個任務時用此方法
//其他程式碼
PS:線上程中需要跨執行緒進行傳值等操作時,直接呼叫會報異常,常用的辦法有
使用ParameterizedThreadStart委託
//方法中不準有返回值或形參 Thread thread = new Thread(new ParameterizedThreadStart(MessageShow)); thread.Start("!!!"); private void MessageShow(object obj) { string msg= obj as string; MessageBox.Show(msg); }
用自定義一個類或屬性用來存值,相當於用一箇中間變數來轉接
匿名方法,如第一個例子
這是winform中的匿名方法
Invoke((Action)(() =>
{
//Enabled = true;
TestDbBtn.Enabled = true;
CreateDbBtn.Enabled = true;
DbPath.Enabled = true;
UserName.Enabled = true;
Service.Enabled = true;
Password.Enabled = true;
DbName.Enabled = true;
DbPath.Enabled = true;
PathBtn.Enabled = true;
}));