System.Reflection.MethodInfo.Invoke和多个线程

时间:2010-09-13 02:43:55

标签: c# multithreading reflection methodinfo

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

例如..

假设我有一个方法允许你传入一个代表一个字符串的字符串 类名和动态调用相应的类方法,现在我想 用线程调用这个Methodinfo.invoke,我不知道怎么做,因为我用paramter调用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.. ????**

3 个答案:

答案 0 :(得分:11)

由于您希望使用System.Threading.Thread创建新线程,而不是在现有UI线程或线程池线程上进行调用,因此首先需要注意的是,使用System.Threading.Thread,您可以使用ThreadStartParameterizedThreadStart代表。

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

这将丢弃任何返回值,但问题中的无螺纹示例也是如此。如果您需要返回值,请发表评论。

答案 1 :(得分: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() { ... }中的代码是在新线程上执行的匿名方法。

答案 2 :(得分:0)

只是一个建议,为什么不使用.Net 4.0 Framework它有一个更简单的线程实现。只需使用Parallel.For,Parallel.ForEach()或Parallel.Invoke()。这里有一些进一步的解释 - &gt; http://anyrest.wordpress.com/2010/09/09/parallel-programming-easier-than-ever-using-net-framework-4/