Remoting プログラムやその他のアプリケーションを作成する場合、必然的にスレッドを処理する必要があります。.Net ではスレッドを簡単に作成できますが、スレッドの作成と開始に提供されるメソッドには、「何をすればよいか」という明確なパラメータがありません。スレッドを使用してクラス内のパラメータを持つメソッドを開始したい場合は?以下に、.NET が提供する豊富なフレームワークを使用してこの機能を実装する方法を簡単に紹介します。プロセス全体を鮮明に詳細に紹介するために、スレッド起動メソッドのキャリアでもある次の .NET クラスを作成しました。クラスは次のようになります
。
namespace WindowsApplication1
{
/// <summary>
/// UrlFetcher の概要の説明
/// </summary>
public class MyClass{
// メソッド 1 の場合
private string _parameter;
public MyClass(stringparameter){
this._parameter = parameter;
}
public void MyMethod1(){
if(this._parameter!=null){
// 何かを実行します
Console.Write(this._parameter) );
}
}
// メソッド 2 の場合
public MyClass(){}
// このメソッドはプライベートですが、パブリックまたは他のプライベートにすることもできます
void MyMethod2(stringparameter){
// 何かを行います
Console.Write(parameter)
}
// デリゲートの WaitCallback のためパラメータの型はオブジェクトです
// 文字列に変換します
public void MyMethod2(objectparameter){
this.MyMethod2((string)parameter)
;
// メソッド 3 の場合
public string MyMethod3(stringparameter){
return "パラメータ値は次のとおりです:"+parameter
;
// 渡された mutil-parameters の場合
public string MyMutilParameters(string param1,string param2){
return "パラメータ 1 とパラメータ 2 の接続結果は次のとおりです: "+param1+param2
}
}
}
ふふ、私の英語は下手ですので、コメントが下手なのはご容赦ください(英語なので)。上記の授業に含まれる内容について簡単に話す必要があると思います。まず、これには 2 つのコンストラクターが含まれており、1 つはパラメーターあり、もう 1 つはパラメーターなし (これは意図的に配置されています)。クラス内の他のメソッドの名前から推測できると思いますが、パラメータを渡す 3 つのメソッドを 1 つずつ紹介します。まず、スレッドを開始する方法を見てみましょう。まず、関数を使用して ThreadStart デリゲートのインスタンスを作成し、このインスタンスをパラメーターの新しいスレッド (Thread) オブジェクトとして使用し、最後にスレッドを開始します。詳細については、MSDN ドキュメントの「スレッド」セクションを参照してください。
結果をテストするために、フォームと 4 つのボタンを含む WinForm プロジェクトを作成しました。すべてのソース コードが必要な場合は、 [email protected]に電子メールを送信してください。時間があればお送りします。 。以下に、それぞれの方法について詳しく説明します。
1. コンストラクターを使用してパラメーターを渡す
ご存知のとおり、オブジェクトを構築するにはコンストラクターを使用して、使用するパラメーター値を最初に渡すことができます。オブジェクト内の内部変数を使用し、パラメーターなしのコンストラクターを使用してこのパラメーターを使用します (パラメーターであるふりをします)。簡単に言うと、関数に必要なパラメータを保存するための変数をクラス内で宣言すると、関数はパラメータのない形式になります。この方法の最大の問題は、カプセル化が破壊されることです。これらの変数に直接アクセスすることはできませんが、隠れた危険が常に存在します (見た目が不快かどうかは問題ではありません)。次のコード スニペットは、このメソッドを使用してパラメータを渡す方法の詳細を示しています。これは、上記の 4 つのボタンの 1 つ (Button1) の Click コードでもあります。パラメータを渡すために、WinForm で次のように変数をグローバルに定義しました。
// これはパラメータの値です
private string myParameter = "ParameterValuen";
ボタン イベントは次のとおりです。
// コンストラクトprivate
によってパラメータをスレッドに渡します
。void button1_Click( object sender, System.EventArgs e) {
MyClass instance = new MyClass(myParameter);
new Thread (new ThreadStart(instance.MyMethod1)).Start();
}
上で述べたように、コンストラクターを使用してパラメーターを渡します。 Go クラスを使用し、上記のメソッドを使用してスレッドを開始すると、プログラムの実行後に出力ウィンドウで MyMethod1 の実行結果を確認できます (TextBox などを使用して WinForm に直接表示することもできます)。パラメータ値。関数本体を見るだけで、結果が正しいことがわかります。とても単純なことではありませんか。
2. ThreadPool を使用してパラメータ転送を実現する
まず、MSDN が ThreadPool をどのように説明しているかを見てみましょう。これは、作業項目の送信、非同期 I/O の処理、他のスレッドの代わりの待機、およびタイマーの処理に使用できるスレッドのプールを提供します。そのメソッド コレクションを表示します。そのうちの 1 つは QueueUserWorkItem と呼ばれます。このクラスとこのメソッドの詳細については、MSDN 関連のヘルプを参照してください。ここで注意する必要があるのは、QueueUserWorkItem メソッドのパラメーターです。パラメーター WaitCallback はデリゲート タイプです。2 番目のパラメーターは、デリゲート インスタンス (関数でインスタンス化した後) に必要なパラメーターです。オブジェクトタイプの。詳細については、以下のコードを参照してください。
// ThreadPool によってパラメータをスレッドに渡します
private
void button2_Click(object sender, System.EventArgs e) {
MyClass instance = new
ThreadPool.QueueUserWorkItem (new WaitCallback (instance.MyMethod2),myParameter);
}
パラメータはオブジェクト型であるため、メソッドのパラメータを満たすために、MyClass で MyMethod2 のサイズ変更された 2 つのバージョンを定義する必要があります。同様に、パラメータ myParameter を渡してプログラムを実行すると、Button2 をクリックすると、MyMethod2 がパラメータとして myParameter を実行した結果が出力ウィンドウに表示されます。
3. 次に、非同期委任を使用してパラメータ転送を実現する最後の方法です
。同様に、委任の詳細については、上記で詳しく説明されている MSDN を参照してください。ここでは BeginInvoke メソッドと EndInvoke メソッドを使用します。
まず、パラメータを
渡す方法を次のように指定します。
// 非同期デリゲートによってパラメータを
渡し
ます
。 myMethod3 = new MyMethod3Delegate(instance.MyMethod3);
myMethod3.BeginInvoke("parameterValue",new AsyncCallback(AfterMyMothod3),null);
}
public void AfterMyMothod3(IAsyncResult result){
AsyncResult async = (AsyncResult) result
; async.AsyncDelegate;
Console.WriteLine ("関数呼び出しの戻り値: {0}n", DelegateInstance.EndInvoke(result))
}
まず、デリゲートを使用するために、パラメーターを指定する MyMethod3Delegate のデリゲートを宣言します。および戻り値 文字列である関数が対象となるため、MyClass に MyMethod3 メソッドを定義します。この関数の構造は上記のデリゲートに準拠しているため、Button3 がクリックされたときにこのメソッドを使用してデリゲートをインスタンス化し、戻り結果を取得するためにこのメソッドを非同期に呼び出すことができます。関数の実行結果。プログラムを実行し、Button3 をクリックすると、Output に出力される結果が、パラメーターを使用して MyMethod3 を実行した結果であることがわかります。最後に、複数のパラメータを渡す方法を示します。私の例は 2 つのパラメータを渡す方法です。コードは次のとおりです。
//
mutil-parameters は
デリゲート文字列 MyMutilParamsDelegate(string パラメータ 1, 文字列パラメータ 2)
を
渡し
ます。インスタンス.MyMutilParameters );
mutilParams.BeginInvoke("param1","params2",new AsyncCallback(AfterMutilParams),null)
;
public void AfterMutilParams(IAsyncResult result){
AsyncResult async = (AsyncResult) result;
MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate;
("複数パラメータ関数呼び出しが結果を返します: {0}", DelegateInstance.EndInvoke( result ));
}
スペースの都合上、コードについては詳しく説明しません。不正確な点があれば修正してください。読んでいただきありがとうございます。連絡先情報: [email protected] CSDN フォーラム ID: cuike519
参考ドキュメント: