C#: вызовите метод с помощью [Type].InvokeMember() в отдельном потоке
Я использую этот код, где я использую тег run
метод списка классов, которые я динамически загружал из DLL:
for (int i = 0; i < robotList.Count; i++)
{
Type t = robotList[i]; //robotList is a List<Type>
object o = Activator.CreateInstance(t);
t.InvokeMember("run", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null);
}
на invokeMember
вызывает run
метод каждого из классов в списке.
теперь как я могу вызвать этот run
метод invokeMember
в отдельном потоке ? Так что у меня будут отдельные потоки, запущенные для каждого из вызываемых методов.
2 ответов
Если вы знаете, что все ваши динамически загруженные типы реализуют Run, не могли бы вы просто потребовать, чтобы все они реализовали IRunable и избавились от части отражения?
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<Type> robotList = new List<Type>(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]);
}
}
}
}