2009-02-03 14 views
7

Estoy utilizando este código en el que estoy invocando el método de la lista de clases que he cargado dinámicamente desde dlls run:C#: Invocar un método con el [Tipo] .InvokeMember() en un hilo separado

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

El invokeMember invoca el método run de cada una de las clases de la lista.

Ahora cómo puedo invocar este método desde runinvokeMember en un hilo separado? Para que tenga hilos separados en ejecución para cada uno de los métodos invocados.

Respuesta

19

Si sabe que todos los tipos cargados dinámicamente implementan Ejecutar, ¿podría simplemente requerir que todos implementen IRunable y se deshagan de la parte de reflexión?

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 
} 

Si no es así, esto va a funcionar:

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

excelente, exactamente lo que estaba buscando. Y gracias por la mención de IRunable ... Lo estoy probando ahora. Gracias de nuevo. –

+0

Excelente ... Cambié las clases para usar una interfaz IRunnable como sugirió. –

2

Tenga una mirada en esta muestra de una manera de hacerlo:

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

Error, jure que actualizo esta página antes de presionar enviar :) –

Cuestiones relacionadas