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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/505523/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-04 06:02:01  来源:igfitidea点击:

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

c#.netmultithreadingreflection

提问by Andreas Grech

I am using this code where I am invoking the runmethod of a List of classes that I loaded dynamically from dlls:

我正在使用此代码,在其中调用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);
}

The invokeMemberis invoking the runmethodof each of the classes in the list.

invokeMember被调用run推法每一类在列表中。

Now how can I invoke this runmethod from invokeMemberin a separate Thread? So that I'll have separate threads running for each of the invoked methods.

现在如何runinvokeMember单独的 Thread调用此方法?这样我就会为每个调用的方法运行单独的线程。

采纳答案by Rex M

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

回答by OJ.

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