應用程序可以擁有多個線程,當程序需要大量時間來處理部分業務或流程時,就可以通過線程來操作,如果應用程序沒有用到線程,那將會出現很麻煩的事情,例如:界面上有個dataGridView需要填充數據,如果有Form_Load事件中實現數據綁定,如果在主線程中操作,那麼你運行打開窗體的時候就會出現程序假死的現象.這不是客戶所接受的,所以在程序開發中,線程的應用是不可缺少的一部分.
我們用多線程來開發程序,目的就是減少處理器單元的閒置時間,增加處理器單元的操作能力.但這並不能說明在程序中可以泛用多線程,應用不當,會降低系統的性能.例如:如果完成一個作業需要的時間為N,在多線程的情況下,創建線程需要的時間為N0,線程中處理的作業需要的時間為N1,線程銷毀需要的時間是N3,還有一些其它的時間這裡就不算了,這裡可以看出如果作業流程簡單的,占用資源和時間不長的則不需要利用一個線程來處理,如果一個作業需要不停的創建線程則需要利用到線程池,從而提高程序的性能.
需要多線程作業,需要添加System.Threading命名空間,下面細說一個Thread的操作:
通過Thread一次使用一個線程,來創建和刪除線程.
創建線程:
Thread th = new Thread(new ThreadStart(Method));
開始線程:
th.Start();
銷毀線程:
th.Abort();
線程名稱:
th.Name="A";
線程休眠:
th.Sleep();
線程掛起:
th.Suspend();
線程恢復:
th.Resume();
說到Thread還有一個方法就是設置後台線程
IsBackground屬性設為true,該線程即為後台線程。
後台線程跟前台線程只有一個區別,那就是後台線程不妨礙程序的終止。一旦一個進程所有的前台線程都終止後,
CLR將通過調用任意一個存活中的後台進程的Abort()方法來徹底終止進程。注意:後台線程不能直接操作所在進程
之外的數據引用。
通過ThreadPool來創建線程,如果你的程序需要頻繁的創建線程的時候你就可以用到這個類,用實現創建線程,提高程
序的性能.通過ThreadPool.QueueUserWorkItem(new WaitCallback(Method), 1)來創建線程池下面請看一下面的代碼:
private void button2_Click(object sender, EventArgs e)
{
int maxTh, minTh, portTh;
ThreadPool.GetMaxThreads(out maxTh, out portTh);
ThreadPool.GetMinThreads(out minTh, out portTh);
richTextBox1.Text = maxTh.ToString() + " , " + minTh.ToString() + " , " + portTh.ToString() + "
";
ThreadPool.QueueUserWorkItem(new WaitCallback(A1), 1);
ThreadPool.QueueUserWorkItem(new WaitCallback(A2), 1);
}
private void A1(object i)
{
string str = i.ToString();
if (this.InvokeRequired)
{
updateRichTxt ur = new updateRichTxt(UpdateRT);
this.Invoke(ur, str);
}
}
private void A2(object i)
{
string str = ((int)i + 1).ToString();
if (this.InvokeRequired)
{
updateRichTxt ur = new updateRichTxt(UpdateRT);
this.Invoke(ur, str);
}
}
private delegate void updateRichTxt(string iTxt);
private void UpdateRT(string iTxt)
{
richTextBox1.Text = richTextBox1.Text + iTxt + "
";
}
到這裡你應該清楚,多線程的正確應用。