如何向線程傳遞參數


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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM