C #: вызов метода с [Type] .InvokeMember () в отдельном потоке - PullRequest
7 голосов
/ 03 февраля 2009

Я использую этот код, когда я вызываю метод 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 ]

19 голосов
/ 03 февраля 2009

Если вы знаете, что все ваши динамически загружаемые типы реализуют 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();
}
2 голосов
/ 03 февраля 2009

Взгляните на этот образец для одного из способов сделать это:

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]);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...