嗨,我如何调用带有线程的参数的system.reflection.methodinfo.invoke()。

例如..

说我有一种方法,可以让您传递代表类名称并动态调用对应类方法的字符串,现在我想调用this MethodInfo.invo.invoke threads,我不知道该怎么办使用参数。代码段给定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.. ????**
有帮助吗?

解决方案

由于您想创建一个新线程 System.Threading.Thread 首先要注意的是,与其在现有的UI线程或线程泵线程上打电话是 System.Threading.Thread 您可以使用任何一个 ThreadStart 或者 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);

如果您使用.NET 2.0,请取出关键字 this 从参数列表中,然后呼叫:

InvokeOnNewThread(mi, obj, parameters);

这将丢弃任何返回值,但是您的问题中未进行的示例也是如此。如果您需要退货价值,请发表评论。

其他提示

您可以使用匿名方法启动线程:

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() { ... } 是在新线程上执行的匿名方法。

只是一个建议,为什么不使用.NET 4.0框架它具有更轻松的线程实现。只需并行使用Parallel.Foreach()或Parallel.Invoke()即可。这里有一些进一步的解释 - > http://anyrest.wordpress.com/2010/09/09/parallelal-programming-easier-easier-than-ever-ever-using-net-framework-4/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top