System.Reflection.methodinfo.invoke和多个线程
-
02-10-2019 - |
题
嗨,我如何调用带有线程的参数的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/