4

嗨,我如何使用带有线程的参数调用 System.Reflection.MethodInfo.Invoke()。

例如..

假设我有一个方法允许您传入一个表示类名的字符串并动态调用相应的类方法,现在我想用线程调用这个 Methodinfo.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您可以使用 aThreadStartParameterizedThreadStart委托。

您确实需要线程的 main 方法的参数,但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);

如果您使用的是 .NET 2.0,则从参数列表中取出关键字this并调用如下:

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 框架,它具有更简单的线程实现。只需使用 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 回答