简体   繁体   English

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

[英]C# : Invoke a method with [Type].InvokeMember() in a separate Thread

I am using this code where I am invoking the run method of a List of classes that I loaded dynamically from dlls: 我正在使用此代码,我正在调用从dll动态加载的类的List的run方法:

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);
}

The invokeMember is invoking the run methodof each of the classes in the list. invokeMember正在调用列表中每个类的run方法。

Now how can I invoke this run method from invokeMember in a separate Thread ? 现在我如何在一个单独的线程中从invokeMember调用此run方法 So that I'll have separate threads running for each of the invoked methods. 这样我就可以为每个被调用的方法运行单独的线程。

If you know that all your dynamically loaded types implement Run, could you just require they all implement IRunable and get rid of the reflection part? 如果您知道所有动态加载的类型都实现了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
}

If not, this will work: 如果没有,这将有效:

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();
}

Have a look at this sample for one way of doing it: 看看这个样本的一种方法:

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]);
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM