国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

如何在調(diào)用線程的時(shí)候傳遞參數(shù)

2024-07-21 02:29:48
字體:
供稿:網(wǎng)友

我們?cè)趯憆emoting程序或者其他的一些應(yīng)用程序的時(shí)候難免要和線程打交道,.net使我們很容易就可以創(chuàng)建一個(gè)線程,但是它提供的創(chuàng)建線程和啟動(dòng)線程的方法沒有明顯的提供參數(shù),假如我們要用線程來啟動(dòng)類里面一個(gè)帶參數(shù)的方法該怎么辦?下面就簡(jiǎn)單的介紹如何使用.net提供的豐富的框架來實(shí)現(xiàn)這個(gè)功能。為了可以生動(dòng)詳細(xì)的介紹整個(gè)過程,我建立下面的一個(gè).net類,它也是要用線程啟動(dòng)的方法的載體。類如下所示:

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 "參數(shù)值為:"+parameter;

              }

 

              // for mutil-parameters passed

              public string mymutilparameters(string param1,string param2){

                     return "參數(shù)1和參數(shù)2連接結(jié)果為:"+param1+param2;

              }

             

       }

}

 

嘿嘿,我的英語不行,注釋寫的不好請(qǐng)見諒(因?yàn)槭褂玫氖怯⑽牡模M麤]有影響您的閱讀。我想我有必要簡(jiǎn)單的說一下上面這個(gè)類里里面的所包含的內(nèi)容。首先包含兩個(gè)構(gòu)造函數(shù),一個(gè)帶參數(shù)一個(gè)不帶(這里可是有意安排的)。通過類中其他方法的名字我想您一定猜出來我將介紹3種方法來傳遞參數(shù),接下來我將逐一介紹。首先我們看看如何啟動(dòng)一個(gè)線程,首先我們可以用一個(gè)函數(shù)來實(shí)例化threadstart委托的一個(gè)實(shí)例,然后在使用這個(gè)實(shí)例作為參數(shù)new線程(thread)對(duì)象,最后將這個(gè)線程start就可以了,想了解更多請(qǐng)參考msdn文檔的thread部分。

為了測(cè)試我們的結(jié)果我建立了一個(gè)winform的工程,其中有一個(gè)form和4個(gè)按鈕,如果你需要所有的源碼請(qǐng)發(fā)送郵件到[email protected],如果我有時(shí)間我會(huì)給你發(fā)過去的。接下來是每種方法的詳細(xì)描述。

1、使用構(gòu)造函數(shù)來傳遞參數(shù)

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

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

       }

正如上面所說的,我們使用構(gòu)造函數(shù)傳遞參數(shù)到類里面去,然后在使用上面所說的方法啟動(dòng)了一個(gè)線程,我們可以在運(yùn)行該程序后的output窗口中看到mymethod1的執(zhí)行結(jié)果是(你也可以用一個(gè)textbox或者其他什么東西直接顯示在winform上):parametervalue  。看看函數(shù)體就知道這個(gè)結(jié)果是正確的。是不是很簡(jiǎn)單。

2、使用threadpool來實(shí)現(xiàn)參數(shù)的傳遞

我們首先可以看看msdn對(duì)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.查看它的方法集合其中有一個(gè)叫:queueuserworkitem 的方法,該類以及該方法的詳細(xì)信息請(qǐng)參考msdn相關(guān)幫助。這里需要注意的就是queueuserworkitem方法的參數(shù),參數(shù)waitcallback是一個(gè)委托類型,第二個(gè)參數(shù)就是該委托實(shí)例(用函數(shù)實(shí)例化以后,也就是一個(gè)函數(shù))所需要的參數(shù),是object類型的。詳細(xì)內(nèi)容請(qǐng)看下面的代碼。

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

}

       因?yàn)閝ueueuserworkitem的二個(gè)參數(shù)是object類型的所以我們要在myclass里面定義兩個(gè)mymethod2的重裁版本,目的就是為了滿足該方法的參數(shù)。同樣我們將參數(shù)myparameter傳遞進(jìn)去了,運(yùn)行程序,當(dāng)我們點(diǎn)擊button2的時(shí)候在output窗口中將會(huì)出現(xiàn)mymethod2將myparameter作為參數(shù)執(zhí)行的結(jié)果顯示出來。

       3、接下來是最后一種方法使用異步委托來實(shí)現(xiàn)參數(shù)的傳遞

       同樣,有關(guān)委托的詳細(xì)信息可以參考msdn,上面說的非常詳細(xì)。我們這里要使用到begininvoke和endinvoke方法。首先我們給出傳遞一個(gè)參數(shù)的方法如下所示:

// 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 ("函數(shù)調(diào)用返回值:{0}/n", delegateinstance.endinvoke(result));

       }    

       首先為了使用委托我們聲明了一個(gè)mymethod3delegate的委托,該委托說明一個(gè)參數(shù)和返回值為string的函數(shù)是符合條件的,所以我們?cè)趍yclass里面定義了一個(gè)mymethod3的方法。該函數(shù)的型構(gòu)符合上面的委托,所以我們可以在button3點(diǎn)擊的時(shí)候用這個(gè)方法實(shí)例化一個(gè)委托,然后我們使用異步的方式調(diào)用這個(gè)方法,為了得到返回結(jié)果我們寫了aftermymothod3方法用來顯示該函數(shù)的執(zhí)行結(jié)果。運(yùn)行程序點(diǎn)擊button3可以看到output中輸出的結(jié)果為mymethod3帶參數(shù)執(zhí)行的結(jié)果。最后我給出如何傳遞多個(gè)參數(shù)的方法,我的例子是傳遞2個(gè)參數(shù)。代碼如下:

// 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 ("多參數(shù)函數(shù)調(diào)用返回結(jié)果:{0}/n", delegateinstance.endinvoke(result));

       }

由于篇幅關(guān)系代碼就不作詳細(xì)說明了。有不正確的地方請(qǐng)指正,謝謝閱讀!聯(lián)系方式:[email protected]  csdn論壇id:cuike519

參考文檔:

http://www.codeproject.com/purgatory/threadsinc_.asp

http://www.msdn.com

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 通河县| 克东县| 广宁县| 陈巴尔虎旗| 东乡族自治县| 普洱| 前郭尔| 阿拉尔市| 清涧县| 榆树市| 洪江市| 宣汉县| 天祝| 山阴县| 司法| 海安县| 平山县| 若尔盖县| 麻栗坡县| 敖汉旗| 航空| 郸城县| 宁夏| 全州县| 泰和县| 兴文县| 禹州市| 勐海县| 永清县| 安达市| 江西省| 长泰县| 慈溪市| 英山县| 长春市| 紫阳县| 敖汉旗| 锡林郭勒盟| 中卫市| 五大连池市| 南郑县|