如何在调用线程的时候传递参数
生活随笔
收集整理的這篇文章主要介紹了
如何在调用线程的时候传递参数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如何在調(diào)用線程的時(shí)候傳遞參數(shù) 如何在調(diào)用線程的時(shí)候傳遞參數(shù)
我們?cè)趯慠emoting程序或者其他的一些應(yīng)用程序的時(shí)候難免要和線程打交道,.Net使我們很容易就可以創(chuàng)建一個(gè)線程,但是它提供的創(chuàng)建線程和啟動(dòng)線程的方法沒(méi)有明顯的提供參數(shù),假如我們要用線程來(lái)啟動(dòng)類里面一個(gè)帶參數(shù)的方法該怎么辦?下面就簡(jiǎn)單的介紹如何使用.NET提供的豐富的框架來(lái)實(shí)現(xiàn)這個(gè)功能。為了可以生動(dòng)詳細(xì)的介紹整個(gè)過(guò)程,我建立下面的一個(gè).NET類,它也是要用線程啟動(dòng)的方法的載體。類如下所示:
復(fù)制C#代碼保存代碼 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; } } }
嘿嘿,我的英語(yǔ)不行,注釋寫的不好請(qǐng)見諒(因?yàn)槭褂玫氖怯⑽牡?#xff09;,希望沒(méi)有影響您的閱讀。我想我有必要簡(jiǎn)單的說(shuō)一下上面這個(gè)類里里面的所包含的內(nèi)容。首先包含兩個(gè)構(gòu)造函數(shù),一個(gè)帶參數(shù)一個(gè)不帶(這里可是有意安排的)。通過(guò)類中其他方法的名字我想您一定猜出來(lái)我將介紹3種方法來(lái)傳遞參數(shù),接下來(lái)我將逐一介紹。首先我們看看如何啟動(dòng)一個(gè)線程,首先我們可以用一個(gè)函數(shù)來(lái)實(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ā)送郵件到wu_jian830@hotmail.com,如果我有時(shí)間我會(huì)給你發(fā)過(guò)去的。接下來(lái)是每種方法的詳細(xì)描述。
1、使用構(gòu)造函數(shù)來(lái)傳遞參數(shù)
眾所周知,我們可以使用一個(gè)帶參數(shù)的構(gòu)造函數(shù)來(lái)構(gòu)造對(duì)象,既然這樣我們可以利用構(gòu)造函數(shù)先將要使用的參數(shù)值傳遞到對(duì)象里面的內(nèi)部變量上,然后再使用一個(gè)無(wú)參數(shù)的方法來(lái)使用這個(gè)參數(shù)(假裝參數(shù))。簡(jiǎn)單的說(shuō)就是,在類里面聲明一個(gè)變量專門用來(lái)保存函數(shù)需要的參數(shù),函數(shù)變成無(wú)參的形式。這種方法的最大問(wèn)題就是破壞了封裝性,雖然我們不能直接方法這些變量但是隱患總是存在的(或者說(shuō)看上去不爽都可以)。下面代碼片斷給出了如何使用這個(gè)方法來(lái)傳遞參數(shù)的詳細(xì)內(nèi)容,這也是上面提到的4個(gè)按鈕中的一個(gè)按鈕(Button1)的Click代碼。為了有參數(shù)可傳我在WinForm全局定義了一個(gè)如下的變量:
復(fù)制C#代碼保存代碼 // This is parameter's value private string myParameter = "ParameterValue\n";
按鈕事件如下所示:
復(fù)制C#代碼保存代碼 // 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(); }
正如上面所說(shuō)的,我們使用構(gòu)造函數(shù)傳遞參數(shù)到類里面去,然后在使用上面所說(shuō)的方法啟動(dòng)了一個(gè)線程,我們可以在運(yùn)行該程序后的output窗口中看到MyMethod1的執(zhí)行結(jié)果是(你也可以用一個(gè)TextBox或者其他什么東西直接顯示在WinForm上):ParameterValue??。看看函數(shù)體就知道這個(gè)結(jié)果是正確的。是不是很簡(jiǎn)單。
2、使用ThreadPool來(lái)實(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)看下面的代碼。
復(fù)制C#代碼保存代碼 // 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é)果顯示出來(lái)。
3、接下來(lái)是最后一種方法使用異步委托來(lái)實(shí)現(xiàn)參數(shù)的傳遞
同樣,有關(guān)委托的詳細(xì)信息可以參考MSDN,上面說(shuō)的非常詳細(xì)。我們這里要使用到BeginInvoke和EndInvoke方法。首先我們給出傳遞一個(gè)參數(shù)的方法如下所示:
復(fù)制C#代碼保存代碼 // 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的委托,該委托說(shuō)明一個(gè)參數(shù)和返回值為string的函數(shù)是符合條件的,所以我們?cè)贛yClass里面定義了一個(gè)MyMethod3的方法。該函數(shù)的型構(gòu)符合上面的委托,所以我們可以在Button3點(diǎn)擊的時(shí)候用這個(gè)方法實(shí)例化一個(gè)委托,然后我們使用異步的方式調(diào)用這個(gè)方法,為了得到返回結(jié)果我們寫了AfterMyMothod3方法用來(lái)顯示該函數(shù)的執(zhí)行結(jié)果。運(yùn)行程序點(diǎn)擊Button3可以看到Output中輸出的結(jié)果為MyMethod3帶參數(shù)執(zhí)行的結(jié)果。最后我給出如何傳遞多個(gè)參數(shù)的方法,我的例子是傳遞2個(gè)參數(shù)。代碼如下:
復(fù)制C#代碼保存代碼 // 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)); } posted on 2007-04-13 20:46 zwgood 閱讀(...) 評(píng)論(...) 編輯 收藏
我們?cè)趯慠emoting程序或者其他的一些應(yīng)用程序的時(shí)候難免要和線程打交道,.Net使我們很容易就可以創(chuàng)建一個(gè)線程,但是它提供的創(chuàng)建線程和啟動(dòng)線程的方法沒(méi)有明顯的提供參數(shù),假如我們要用線程來(lái)啟動(dòng)類里面一個(gè)帶參數(shù)的方法該怎么辦?下面就簡(jiǎn)單的介紹如何使用.NET提供的豐富的框架來(lái)實(shí)現(xiàn)這個(gè)功能。為了可以生動(dòng)詳細(xì)的介紹整個(gè)過(guò)程,我建立下面的一個(gè).NET類,它也是要用線程啟動(dòng)的方法的載體。類如下所示:
復(fù)制C#代碼保存代碼 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; } } }
嘿嘿,我的英語(yǔ)不行,注釋寫的不好請(qǐng)見諒(因?yàn)槭褂玫氖怯⑽牡?#xff09;,希望沒(méi)有影響您的閱讀。我想我有必要簡(jiǎn)單的說(shuō)一下上面這個(gè)類里里面的所包含的內(nèi)容。首先包含兩個(gè)構(gòu)造函數(shù),一個(gè)帶參數(shù)一個(gè)不帶(這里可是有意安排的)。通過(guò)類中其他方法的名字我想您一定猜出來(lái)我將介紹3種方法來(lái)傳遞參數(shù),接下來(lái)我將逐一介紹。首先我們看看如何啟動(dòng)一個(gè)線程,首先我們可以用一個(gè)函數(shù)來(lái)實(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ā)送郵件到wu_jian830@hotmail.com,如果我有時(shí)間我會(huì)給你發(fā)過(guò)去的。接下來(lái)是每種方法的詳細(xì)描述。
1、使用構(gòu)造函數(shù)來(lái)傳遞參數(shù)
眾所周知,我們可以使用一個(gè)帶參數(shù)的構(gòu)造函數(shù)來(lái)構(gòu)造對(duì)象,既然這樣我們可以利用構(gòu)造函數(shù)先將要使用的參數(shù)值傳遞到對(duì)象里面的內(nèi)部變量上,然后再使用一個(gè)無(wú)參數(shù)的方法來(lái)使用這個(gè)參數(shù)(假裝參數(shù))。簡(jiǎn)單的說(shuō)就是,在類里面聲明一個(gè)變量專門用來(lái)保存函數(shù)需要的參數(shù),函數(shù)變成無(wú)參的形式。這種方法的最大問(wèn)題就是破壞了封裝性,雖然我們不能直接方法這些變量但是隱患總是存在的(或者說(shuō)看上去不爽都可以)。下面代碼片斷給出了如何使用這個(gè)方法來(lái)傳遞參數(shù)的詳細(xì)內(nèi)容,這也是上面提到的4個(gè)按鈕中的一個(gè)按鈕(Button1)的Click代碼。為了有參數(shù)可傳我在WinForm全局定義了一個(gè)如下的變量:
復(fù)制C#代碼保存代碼 // This is parameter's value private string myParameter = "ParameterValue\n";
按鈕事件如下所示:
復(fù)制C#代碼保存代碼 // 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(); }
正如上面所說(shuō)的,我們使用構(gòu)造函數(shù)傳遞參數(shù)到類里面去,然后在使用上面所說(shuō)的方法啟動(dòng)了一個(gè)線程,我們可以在運(yùn)行該程序后的output窗口中看到MyMethod1的執(zhí)行結(jié)果是(你也可以用一個(gè)TextBox或者其他什么東西直接顯示在WinForm上):ParameterValue??。看看函數(shù)體就知道這個(gè)結(jié)果是正確的。是不是很簡(jiǎn)單。
2、使用ThreadPool來(lái)實(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)看下面的代碼。
復(fù)制C#代碼保存代碼 // 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é)果顯示出來(lái)。
3、接下來(lái)是最后一種方法使用異步委托來(lái)實(shí)現(xiàn)參數(shù)的傳遞
同樣,有關(guān)委托的詳細(xì)信息可以參考MSDN,上面說(shuō)的非常詳細(xì)。我們這里要使用到BeginInvoke和EndInvoke方法。首先我們給出傳遞一個(gè)參數(shù)的方法如下所示:
復(fù)制C#代碼保存代碼 // 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的委托,該委托說(shuō)明一個(gè)參數(shù)和返回值為string的函數(shù)是符合條件的,所以我們?cè)贛yClass里面定義了一個(gè)MyMethod3的方法。該函數(shù)的型構(gòu)符合上面的委托,所以我們可以在Button3點(diǎn)擊的時(shí)候用這個(gè)方法實(shí)例化一個(gè)委托,然后我們使用異步的方式調(diào)用這個(gè)方法,為了得到返回結(jié)果我們寫了AfterMyMothod3方法用來(lái)顯示該函數(shù)的執(zhí)行結(jié)果。運(yùn)行程序點(diǎn)擊Button3可以看到Output中輸出的結(jié)果為MyMethod3帶參數(shù)執(zhí)行的結(jié)果。最后我給出如何傳遞多個(gè)參數(shù)的方法,我的例子是傳遞2個(gè)參數(shù)。代碼如下:
復(fù)制C#代碼保存代碼 // 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)); } posted on 2007-04-13 20:46 zwgood 閱讀(...) 評(píng)論(...) 編輯 收藏
轉(zhuǎn)載于:https://www.cnblogs.com/zw0736/archive/2007/04/13/712541.html
總結(jié)
以上是生活随笔為你收集整理的如何在调用线程的时候传递参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2006年软件500强
- 下一篇: TcpSocket编程与Event编写学