ThreadPool.QueueUserWorkItem多執行緒

  • 9982
  • 0
  • C#
  • 2016-06-29

摘要:ThreadPool.QueueUserWorkItem多執行緒

善用多執行緒的技巧,可以讓應用程式執行的更順暢,減少因進行長時間動作而使UI凍結的情況。但執行緒也不是免費的,每個執行緒需要大約1 MB的記憶體,建立及啟動也需要花一點時間,為了減輕建立執行緒時所耗費的時間,.NET Framework 2.0提出了Thread Pooling概念,底層CLR會維持固定數量的執行緒運行,當設計師透過呼叫QueueUserWorkItem函式將delegate傳入時,Thread Pool會查看目前是否有閒置的ThreadPool池中,有的話就讓這個Thread來呼叫傳入的delegate,否的話就建立一個新的Thread來執行,Thread Pool透過預建Thread的方式,來減少因頻繁建立/釋放 Thread而耗費的時間。

下列為正常寫法

private void setText(Object str)
    {
        
        using (StreamWriter sw = new StreamWriter(@"D:\test.txt",true,Encoding.UTF8))
        {
            sw.WriteLine(str.ToString());
        }
    }
    
    protected void Button1_Click(object sender, EventArgs e)
    {
        string str = "測試四";
        ThreadPool.QueueUserWorkItem(new WaitCallback(setText),(Object) str);
    }

下列為委派方式簡化程式碼

protected void Button1_Click(object sender, EventArgs e)
    {
        string str = "測試三";
        ThreadPool.QueueUserWorkItem(delegate
        {
            using (StreamWriter sw = new StreamWriter(@"D:\test.txt", true, Encoding.UTF8)) 
                                                         //路徑 ,  不複寫檔案 ,  編碼
            {
                sw.WriteLine(str);
            }
        });
    }

下列為Lambda寫法

protected void Button1_Click(object sender, EventArgs e)
    {
        string str = "測試五";
        ThreadPool.QueueUserWorkItem(callback =>
        {
            using (StreamWriter sw = new StreamWriter(@"D:\test.txt", true, Encoding.UTF8))
            {
                sw.WriteLine(str.ToString());
            }
        });
    }

出處:http://www.dotblogs.com.tw/code6421/archive/2010/02/25/13766.aspx#22283