Net提供了許多多線程編程工具,可能是因為太多了,所以掌握起來總是有一些頭疼,我在這里講講我總結的一些多線程編程的經驗,希望對大家有幫助
不需要傳遞參數,也不需要返回參數
我們知道啟動一個線程最直觀的辦法是使用Thread類,具體步驟如下
ThreadStart threadStart=new ThreadStart(Calculate);
Thread thread=new Thread(threadStart);
thread.Start();
public void Calculate()
{
double Diameter=0.5;
Console.Write("The Area Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI);
}
很多人知道如何去開啟一個線程,但是不知道如何正確的向線程中傳遞參數。
比較常見的錯誤是用全局變量來向線程傳遞參數,其實這樣做的缺點一是不安全,二是比較麻煩,三是如果要開啟多個線程,就更麻煩。
上面我們用定義了一個ThreadStart類型的委托,這個委托制定了線程需要執行的方法:Calculate,在這個方法里計算了一個直徑為0.5的圓的面積,並輸出.這就構成了最簡單的多線程的例子,在很多情況下這就夠用了,然后ThreadStart這個委托定義為void ThreadStart(),也就是說,所執行的方法不能有參數,這顯然是個很大的不足,為了彌補這個缺陷,聰明的程序員想出了許多好的方法,我們將在需要傳遞多個參數一節中進行介紹,這里我們先介紹.Net為了解決這個問題而設定的另外一個委托:就是ParameterizedThreadStart ,我會在下面詳細講述
需要傳遞單個參數
ParameterThreadStart的定義為void ParameterizedThreadStart(object state)??使用這個這個委托定義的線程的啟動函數可以接受一個輸入參數,具體例子如下
ParameterizedThreadStart threadStart=new ParameterizedThreadStart(Calculate)
Thread thread=new Thread()
thread.Start(0.9);
//需要注意的是,這里的變量必須為 object類型,如果需要傳遞接口(如arcEngine開發時候使用接口為參數),也需要先轉換為object,在使用時,在轉換回去
public void Calculate(object arg)
{
double Diameter=double(arg);
Console.Write("The Area Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI);
}
Calculate方法有一個為object類型的參數,雖然只有一個參數,而且還是object類型的,使用的時候尚需要類型轉換,但是好在可以有參數了,並且通過把多個參數組合到一個類中,然后把這個類的實例作為參數傳遞,就可以實現多個參數傳遞。
正確的做法是,把線程所需要的參數以及線程入口函數單獨封裝到一個類中,而且如果需要一些輔助函數的話,也封裝到其中。這樣代碼既簡潔,又清晰,同時復用起來很方便。
接着用一個線程類的例子來具體說明,首先是線程類:
//--------------------------ThreadFun Class------------------------------------
//-----------------------------------------------------------------------------
//---File:clsThreadFun.cs
//---Description:This class demonstrates how to use thread class.
//---Author:Knight
//---Date:Mar.21, 2006
//-----------------------------------------------------------------------------
//------------------------{ ThreadFun Class }----------------------------------
using System;
namespace CSNewTest
{
/// <summary>
/// Summary description for clsThreadFun.
/// </summary>
public class clsThreadFun
{
private string strUserName;
public string UserName
{
get{ return strUserName;}
set{ strUserName = value; }
}
public clsThreadFun( string sUserName)
{
//
// TODO: Add constructor logic here
//
strUserName = sUserName;
}
/// <summary>
/// Thread interface function
/// </summary>
public void ThreadFun()
{
//Detail thread handle
}
}
}
接着,是調用代碼:
clsThreadFun myThreadFun = new clsThreadFun( "Test" );
//Set parameter through “myThreadFun.UserName”
Thread myThread = new Thread( new ThreadStart( myThreadFun.ThreadFun ) );
myThread.Start();