4

こんにちは、スレッド付きのパラメータを使用してSystem.Reflection.MethodInfo.Invoke()を呼び出すにはどうすればよいですか。

例えば..

クラス名を表す文字列を渡して、対応するクラスメソッドを動的に呼び出すことができるメソッドがあるとしましょう。今度は、このMethodinfo.invokeをスレッドで呼び出したいのですが、invokeを呼び出しているので、これを行う方法がわかりません。パラメータ付き。meblowを指定したコードスニペット。ご協力ありがとうございました

Type classType = objAssembly.GetType("MyClassName");
object obj = Activator.CreateInstance(classType)
bject[] _objval = new object[3]; 
object[] parameters = new object[] { _objval };
MethodInfo mi = classType.GetMethod("MyMethod");
mi.Invoke(obj, parameters);  // <---**How do i call this with threads.. ????**
4

3 に答える 3

11

System.Threading.Thread既存の UI スレッドまたはスレッドプール スレッドで呼び出しを行うのではなく、新しいスレッドを作成したいので、最初に注意System.Threading.Threadすることは、 aThreadStartまたはParameterizedThreadStartデリゲートのいずれかを使用できることです。

スレッドのメイン メソッドにパラメーターが必要ですが、必要な型にキャストすることを強制するParameterizedThreadStartのみが許可されます。objectしたがって、タイプ セーフな方法で渡されるすべての引数を取得するためにクロージャを使用します。

public void InvokeOnNewThread(this MethodInfo mi, object target, params object[] parameters)
{
     ThreadStart threadMain = delegate () { mi.Invoke(target, parameters); };
     new System.Threading.Thread(threadMain).Start();
}

使用例:

mi.InvokeOnNewThread(obj, parameters);

this.NET 2.0 を使用している場合は、パラメーター リストからキーワードを取り出して、次のように呼び出します。

InvokeOnNewThread(mi, obj, parameters);

これは戻り値を破棄しますが、質問のスレッド化されていない例も破棄します。戻り値が必要な場合は、コメントを残してください。

于 2010-09-13T03:01:32.720 に答える
2

匿名メソッドでスレッドを開始できます。

Thread myThread = new Thread(delegate() {
    object obj = Activator.CreateInstance(typeof(MyClassName));

    object[] _objval = new object[3]; 
    object[] parameters = new object[] { _objval };
    MethodInfo mi = classType.GetMethod("MyMethod");
    mi.Invoke(obj, parameters); 
});
myThread.Start();

内のコードdelegate() { ... }は、新しいスレッドで実行される匿名メソッドです。

于 2010-09-13T03:02:54.390 に答える
0

単なる提案ですが、.Net 4.0 Frameworkを使用してみませんか?スレッドの実装が簡単です。Parallel.For、Parallel.ForEach()またはParallel.Invoke()を使用するだけです。ここでいくつかの詳細な説明-> http://anyrest.wordpress.com/2010/09/09/parallel-programming-easier-than-ever-using-net-framework-4/

于 2010-09-13T03:20:23.107 に答える