1. 程式人生 > >C# 執行緒池簡單用法

C# 執行緒池簡單用法

最簡單的單執行緒運用是直接建立一個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;
                }));