C#:在单独的Thread中调用 .InvokeMember()方法

我正在使用此代码,我在调用从dll动态加载的类的List的run方法:

 for (int i = 0; i < robotList.Count; i++) { Type t = robotList[i]; //robotList is a List object o = Activator.CreateInstance(t); t.InvokeMember("run", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null); } 

invokeMember正在调用列表中每个类的run方法。

现在我如何在一个单独的线程中从invokeMember调用这个run方法 ? 这样我就可以为每个被调用的方法运行单独的线程。

如果您知道所有动态加载的类型都实现了Run,那么您是否只需要它们都实现IRunable并摆脱reflection部分?

 Type t = robotList[i]; IRunable o = Activator.CreateInstance(t) as IRunable; if (o != null) { o.Run(); //do this in another thread of course, see below } 

如果没有,这将有效:

 for (int i = 0; i < robotList.Count; i++) { Type t = robotList[i]; object o = Activator.CreateInstance(t); Thread thread = new Thread(delegate() { t.InvokeMember("Run", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null); }); thread.Start(); } 

看看这个样本的一种方法:

 using System; using System.Threading; using System.Reflection; using System.Collections.Generic; namespace Obfuscation { public class Program { static Type[] robotArray = new Type[] { typeof(Program) }; static List robotList = new List(robotArray); internal void Run() { Console.WriteLine("Do stuff here"); } internal static void RunInstance(object threadParam) { Type t = (Type)threadParam; object o = Activator.CreateInstance((Type)t); t.InvokeMember("Run", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, o, null); } public static void Main(string[] args) { for (int i = 0; i < robotList.Count; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(RunInstance), robotList[i]); } } } }