我們在寫Remoting程序或者其他的一些應用程序的時候難免要和線程打交道使我們很容易就可以創建一個線程
但是它提供的創建線程和啟動線程的方法沒有明顯的提供參數
假如我們要用線程來啟動類裡面一個帶參數的方法該怎麼辦?下面就簡單的介紹如何使用
NET提供的豐富的框架來實現這個功能
為了可以生動詳細的介紹整個過程
我建立下面的一個
NET類
它也是要用線程啟動的方法的載體
類如下所示
using System;
namespace WindowSAPplication
{
/// <summary>
/// Summary description for UrlFetcher
/// </summary>
public class MyClass{
// for method
private string _parameter;
public MyClass(string parameter){
this
_parameter = parameter;
}
public void MyMethod
(){
if(this
_parameter!=null){
// do something
Console
Write(this
_parameter);
}
}
// for method
public MyClass(){}
// this method is private
But it can be public or other
private void MyMethod
(string parameter){
// do something
Console
Write(parameter);
}
// Because delegate WaitCallback
s parameter Type is object
// I will convert it to string
public void MyMethod
(object parameter){
this
MyMethod
((string)parameter);
}
// for method
public string MyMethod
(string parameter){
return
參數值為
+parameter;
}
// for mutil
parameters passed
public string MyMutilParameters(string param
string param
){
return
參數
和參數
連接結果為
+param
+param
;
}
}
}
嘿嘿
我的英語不行
注釋寫的不好請見諒(因為使用的是英文的)
希望沒有影響您的閱讀
我想我有必要簡單的說一下上面這個類裡裡面的所包含的內容
首先包含兩個構造函數
一個帶參數一個不帶(這裡可是有意安排的)
通過類中其他方法的名字我想您一定猜出來我將介紹
種方法來傳遞參數
接下來我將逐一介紹
首先我們看看如何啟動一個線程
首先我們可以用一個函數來實例化ThreadStart委托的一個實例
然後在使用這個實例作為參數new線程(Thread)對象
最後將這個線程Start就可以了
想了解更多請參考MSDN文檔的Thread部分
為了測試我們的結果我建立了一個WinForm的工程
其中有一個Form和
個按鈕
如果你需要所有的源碼請發送郵件到wu
如果我有時間我會給你發過去的
接下來是每種方法的詳細描述
使用構造函數來傳遞參數
眾所周知
我們可以使用一個帶參數的構造函數來構造對象
既然這樣我們可以利用構造函數先將要使用的參數值傳遞到對象裡面的內部變量上
然後再使用一個無參數的方法來使用這個參數(假裝參數)
簡單的說就是
在類裡面聲明一個變量專門用來保存函數需要的參數
函數變成無參的形式
這種方法的最大問題就是破壞了封裝性
雖然我們不能直接方法這些變量但是隱患總是存在的(或者說看上去不爽都可以)
下面代碼片斷給出了如何使用這個方法來傳遞參數的詳細內容
這也是上面提到的
個按鈕中的一個按鈕(Button
)的Click代碼
為了有參數可傳我在WinForm全局定義了一個如下的變量
// This is parameter
s value
private string myParameter =
ParameterValue\n
;
按鈕事件如下所示
// passed parameters to thread by construct
private void button
_Click(object sender
System
EventArgs e) {
MyClass instance = new MyClass(myParameter);
new Thread (new ThreadStart(instance
MyMethod
))
Start();
}
正如上面所說的
我們使用構造函數傳遞參數到類裡面去
然後在使用上面所說的方法啟動了一個線程
我們可以在運行該程序後的output窗口中看到MyMethod
的執行結果是(你也可以用一個TextBox或者其他什麼東西直接顯示在WinForm上)
ParameterValue
看看函數體就知道這個結果是正確的
是不是很簡單
使用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 button
_Click(object sender
System
EventArgs e) {
MyClass instance = new MyClass();
ThreadPool
QueueUserWorkItem (new WaitCallback (instance
MyMethod
)
myParameter);
}
因為QueueUserWorkItem的二個參數是object類型的所以我們要在MyClass裡面定義兩個MyMethod
的重裁版本
目的就是為了滿足該方法的參數
同樣我們將參數myParameter傳遞進去了
運行程序
當我們點擊Button
的時候在output窗口中將會出現MyMethod
將myParameter作為參數執行的結果顯示出來
接下來是最後一種方法使用異步委托來實現參數的傳遞
同樣
有關委托的詳細信息可以參考MSDN
上面說的非常詳細
我們這裡要使用到BeginInvoke和EndInvoke方法
首先我們給出傳遞一個參數的方法如下所示
// passed parameter by asynchronous delegate
delegate string MyMethod
Delegate(string parameter);
private void button
_Click(object sender
System
EventArgs e) {
MyClass instance = new MyClass();
MyMethod
Delegate myMethod
= new MyMethod
Delegate(instance
MyMethod
);
myMethod
BeginInvoke(
parameterValue
new AsyncCallback(AfterMyMothod
)
null);
}
public void AfterMyMothod
(IAsyncResult result){
AsyncResult async = (AsyncResult) result;
MyMethod
Delegate DelegateInstance = (MyMethod
Delegate) async
AsyncDelegate;
Console
WriteLine (
函數調用返回值
{
}\n
DelegateInstance
EndInvoke(result));
}
首先為了使用委托我們聲明了一個MyMethodDelegate的委托該委托說明一個參數和返回值為string的函數是符合條件的所以我們在MyClass裡面定義了一個MyMethod的方法該函數的型構符合上面的委托所以我們可以在Button點擊的時候用這個方法實例化一個委托然後我們使用異步的方式調用這個方法為了得到返回結果我們寫了AfterMyMothod方法用來顯示該函數的執行結果運行程序點擊Button可以看到Output中輸出的結果為MyMethod帶參數執行的結果最後我給出如何傳遞多個參數的方法我的例子是傳遞個參數代碼如下
// mutil
parameters passed
delegate string MyMutilParamsDelegate(string parameter
string parameter
);
private void button
_Click(object sender
System
EventArgs e) {
MyClass instance = new MyClass();
MyMutilParamsDelegate mutilParams = new MyMutilParamsDelegate(instance
MyMutilParameters);
mutilParams
BeginInvoke(
param
params
new AsyncCallback(AfterMutilParams)
null);
}
public void AfterMutilParams(IAsyncResult result){
AsyncResult async = (AsyncResult) result;
MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async
AsyncDelegate;
Console
WriteLine (
多參數函數調用返回結果
{
}\n
DelegateInstance
EndInvoke(result));
}
由於篇幅關系代碼就不作詳細說明了
有不正確的地方請指正
謝謝閱讀!
From:http://tw.wingwit.com/Article/program/net/201311/12317.html