您現在的位置: 365建站網 > 365學習 > Visual C#多線程參數傳遞淺析

Visual C#多線程參數傳遞淺析

文章來源:365jz.com     點擊數:223    更新時間:2009-09-12 16:59   參與評論

我們在寫Remoting程序或者其他的一些應用程序的時候難免要和線程打交道,.Net使我們很容易就可以創建一個線程,但是它提供的創建線程和啟動線程的方法沒有明顯的提供參數,假如我們要用線程來啟動類里面一個帶參數的方法該怎么辦?下面就簡單的介紹如何使用.NET提供的豐富的框架來實現這個功能。為了可以生動詳細的介紹整個過程,我建立下面的一個.NET類,它也是要用線程啟動的方法的載體。類如下所示:

using System;

namespace WindowsApplication1

{

         /// <summary>

         /// Summary description for UrlFetcher.

         /// </summary>

         public class MyClass{

                // for method 1

                private string _parameter;

                public MyClass(string parameter){

                       this._parameter = parameter;

                }

                public void MyMethod1(){

                       if(this._parameter!=null){

                              // do something

                              Console.Write(this._parameter);

                       }

                }

                // for method 2

                public MyClass(){}

                // this method is private,But it can be public or other

                private void MyMethod2(string parameter){

                       // do something

                       Console.Write(parameter);

                }

                // Because delegate WaitCallback's parameter Type is object

                // I will convert it to string.

                public void MyMethod2(object parameter){

                       this.MyMethod2((string)parameter);

                }

                // for method 3

                public string MyMethod3(string parameter){

                       return "參數值為:"+parameter;

                }

                // for mutil-parameters passed

                public string MyMutilParameters(string param1,string param2){

                       return "參數1和參數2連接結果為:"+param1+param2;

                }

         }

}

嘿嘿,我的英語不行,注釋寫的不好請見諒(因為使用的是英文的),希望沒有影響您的閱讀。我想我有必要簡單的說一下上面這個類里里面的所包含的內容。首先包含兩個構造函數,一個帶參數一個不帶(這里可是有意安排的)。通過類中其他方法的名字我想您一定猜出來我將介紹3種方法來傳遞參數,接下來我將逐一介紹。首先我們看看如何啟動一個線程,首先我們可以用一個函數來實例化ThreadStart委托的一個實例,然后在使用這個實例作為參數new線程(Thread)對象,最后將這個線程Start就可以了,想了解更多請參考MSDN文檔的Thread部分。

為了測試我們的結果我建立了一個WinForm的工程,其中有一個Form和4個按鈕,如果我有時間我會給你發過去的。接下來是每種方法的詳細描述。

1、使用構造函數來傳遞參數

眾所周知,我們可以使用一個帶參數的構造函數來構造對象,既然這樣我們可以利用構造函數先將要使用的參數值傳遞到對象里面的內部變量上,然后再使用一個無參數的方法來使用這個參數(假裝參數)。簡單的說就是,在類里面聲明一個變量專門用來保存函數需要的參數,函數變成無參的形式。這種方法的最大問題就是破壞了封裝性,雖然我們不能直接方法這些變量但是隱患總是存在的(或者說看上去不爽都可以)。下面代碼片斷給出了如何使用這個方法來傳遞參數的詳細內容,這也是上面提到的4個按鈕中的一個按鈕(Button1)的Click代碼。為了有參數可傳我在WinForm全局定義了一個如下的變量:

// This is parameter's value

         private string myParameter = "ParameterValue\n";

按鈕事件如下所示:

// passed parameters to thread by construct

         private void button1_Click(object sender, System.EventArgs e) {

                MyClass instance = new MyClass(myParameter);

                new Thread (new ThreadStart(instance.MyMethod1)).Start();

         }

正如上面所說的,我們使用構造函數傳遞參數到類里面去,然后在使用上面所說的方法啟動了一個線程,我們可以在運行該程序后的output窗口中看到MyMethod1的執行結果是(你也可以用一個TextBox或者其他什么東西直接顯示在WinForm上):ParameterValue    ??纯春瘮刁w就知道這個結果是正確的。是不是很簡單。

2、使用ThreadPool來實現參數的傳遞

我們首先可以看看MSDN對ThreadPool是怎么形容的,Provides a pool of threads that can be used to post work items, process asynchronous I/O, wait on behalf of other threads, and process timers.查看它的方法集合其中有一個叫:QueueUserWorkItem 的方法,該類以及該方法的詳細信息請參考MSDN相關幫助。這里需要注意的就是QueueUserWorkItem方法的參數,參數WaitCallback是一個委托類型,第二個參數就是該委托實例(用函數實例化以后,也就是一個函數)所需要的參數,是object類型的。詳細內容請看下面的代碼。

// passed parameter to thread by ThreadPool

private void button2_Click(object sender, System.EventArgs e) {

MyClass instance = new MyClass();

       ThreadPool.QueueUserWorkItem (new WaitCallback (instance.MyMethod2),myParameter);

}

         因為QueueUserWorkItem的二個參數是object類型的所以我們要在MyClass里面定義兩個MyMethod2的重裁版本,目的就是為了滿足該方法的參數。同樣我們將參數myParameter傳遞進去了,運行程序,當我們點擊Button2的時候在output窗口中將會出現MyMethod2將myParameter作為參數執行的結果顯示出來。

         3、接下來是最后一種方法使用異步委托來實現參數的傳遞

         同樣,有關委托的詳細信息可以參考MSDN,上面說的非常詳細。我們這里要使用到BeginInvoke和EndInvoke方法。首先我們給出傳遞一個參數的方法如下所示:

// passed parameter by asynchronous delegate

delegate string MyMethod3Delegate(string parameter);

         private void button3_Click(object sender, System.EventArgs e) {

                MyClass instance = new MyClass();

                MyMethod3Delegate myMethod3 = new MyMethod3Delegate(instance.MyMethod3);

                myMethod3.BeginInvoke("parameterValue",new AsyncCallback(AfterMyMothod3),null);

         }

         public void AfterMyMothod3(IAsyncResult result){

                AsyncResult async = (AsyncResult) result;

                MyMethod3Delegate DelegateInstance = (MyMethod3Delegate) async.AsyncDelegate;

                Console.WriteLine ("函數調用返回值:{0}\n", DelegateInstance.EndInvoke(result));

         }     

         首先為了使用委托我們聲明了一個MyMethod3Delegate的委托,該委托說明一個參數和返回值為string的函數是符合條件的,所以我們在MyClass里面定義了一個MyMethod3的方法。該函數的型構符合上面的委托,所以我們可以在Button3點擊的時候用這個方法實例化一個委托,然后我們使用異步的方式調用這個方法,為了得到返回結果我們寫了AfterMyMothod3方法用來顯示該函數的執行結果。運行程序點擊Button3可以看到Output中輸出的結果為MyMethod3帶參數執行的結果。最后我給出如何傳遞多個參數的方法,我的例子是傳遞2個參數。代碼如下:

// mutil-parameters passed

         delegate string MyMutilParamsDelegate(string parameter1,string parameter2);

         private void button4_Click(object sender, System.EventArgs e) {

                MyClass instance = new MyClass();

                MyMutilParamsDelegate mutilParams = new MyMutilParamsDelegate(instance.MyMutilParameters);

                mutilParams.BeginInvoke("param1","params2",new AsyncCallback(AfterMutilParams),null);

         }

         public void AfterMutilParams(IAsyncResult result){

                AsyncResult async = (AsyncResult) result;

                MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate;

                Console.WriteLine ("多參數函數調用返回結果:{0}\n", DelegateInstance.EndInvoke(result));

         }

由于篇幅關系代碼就不作詳細說明了。有不正確的地方請指正,謝謝閱讀!

如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇


發表評論 (223人查看,0條評論)
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼: 點擊我更換圖片
最新評論
------分隔線----------------------------
365建站网-快速批量建站_企业免费建站_智能建站软件系统_在线建站和seo工具
曰批免费视频播放| 乌克兰美女粉嫩b18| 欧美videos欧美同志| 韩国三级bd高清| jizz学生18| av电影在线观看| 偷拍少妇宾馆偷腥高清| 国产三级在线观看播放视频| a片在线观看| 人妻慢慢放弃抵抗开始迎合| japanese日本熟妇| 小嫩嫩12欧美| 五月天婷五月天综合网| 日本三级电影| 中文字字幕在线中文乱码2019| 色婷婷五月| 龚玥菲版新梅瓶在线观看| 人与动人物xxxx国产| 向日葵视频app| 51视频在线视频观看| 办公室a片在线观看| 三级a片| 国产真实乱对白精彩| 免费少妇a级毛片| http://www.windygirl.net