2010-09-13 2 views
4

Привет, как я могу вызвать System.Reflection.MethodInfo.Invoke() с параметрами с потоками.System.Reflection.MethodInfo.Invoke и несколько потоков

Например ..

Скажем, у меня есть метод, который позволяет передать строку, которая представляет собой имя класса и динамически вызывает соответствующий метод класса, теперь я хочу, чтобы называют это Methodinfo.invoke с потоками , Я понятия не имею, как это сделать, поскольку я вызываю invoke с параметром. Фрагмент кода, предоставленный meblow. Спасибо за вашу помощь

Type classType = objAssembly.GetType("MyClassName"); 
object obj = Activator.CreateInstance(classType) 
bject[] _objval = new object[3]; 
object[] parameters = new object[] { _objval }; 
MethodInfo mi = classType.GetMethod("MyMethod"); 
mi.Invoke(obj, parameters); // <---**How do i call this with threads.. ????** 
+0

Вы хотите, чтобы вызов поперечной нити в потоке пользовательского интерфейса, поток потока или новый рабочий поток? –

+2

Ваш вопрос не имеет смысла. – SLaks

+0

эй, я новичок в C# и изучаю его каждый день. У меня очень мало идей о потоках. Усушно я называю нить вроде Thread t = new Thread (pts); t.Start(); , Точно так же я хочу назвать это mi.invoke wit hthreads. Надеюсь, вы понимаете, что я говорю –

ответ

11

Поскольку Вы желаете создать новую тему с System.Threading.Thread, а не сделать вызов на существующий UI нить или Threadpool нить, первое, что нужно отметить, что с System.Threading.Thread вы можете использовать либо a ThreadStart или ParameterizedThreadStart делегат.

Вам нужны параметры для основного метода потока, но ParameterizedThreadStart разрешает использовать только object, что заставляет вас применять его к требуемому типу. Поэтому мы просто используем закрытие, чтобы все аргументы передавались безопасным образом. Использование

public void InvokeOnNewThread(this MethodInfo mi, object target, params object[] parameters) 
{ 
    ThreadStart threadMain = delegate() { mi.Invoke(target, parameters); }; 
    new System.Threading.Thread(threadMain).Start(); 
} 

Пример:

mi.InvokeOnNewThread(obj, parameters); 

Если вы работаете с .NET 2.0, а затем вынимают ключевое слово this из списка параметров и назвать как:

InvokeOnNewThread(mi, obj, parameters); 

Это будет отбросить любое возвращаемое значение, но так же был и непросмотренный пример в вашем вопросе. Если вам нужно вернуть значение, оставляйте комментарий.

+0

+1 для читаемого кода. –

+0

Thats perfect мой дорогой друг. Большое вам спасибо. Не могли бы вы объяснить мне, что такое ThreadStart threadMain = delegate(). Только с прошлой недели я начал использовать C# после beiong C++ программиста в течение 2 лет. Я знаю, что делегат очень похож на указатель на функцию ... –

+1

Вы уже использовали делегат в своем коде: 'new Thread (pts);' Но этот делегат ссылается на именованный метод. Здесь я использую анонимный метод, созданный с помощью ключевого слова 'delegate', чтобы фиксировать переменные. Это функция C#, а не часть среды выполнения .NET.Компилятор C# фактически создаст класс (с очень странным именем, незаконным для использования в коде C#), в котором хранятся захваченные переменные 'mi',' target' и 'parameters', и он поместит код в метод в этом классе , Затем, когда метод запускается, он может считывать значения параметров с помощью указателя 'this'. –

2

Вы можете начать нить с анонимным методом:

Thread myThread = new Thread(delegate() { 
    object obj = Activator.CreateInstance(typeof(MyClassName)); 

    object[] _objval = new object[3]; 
    object[] parameters = new object[] { _objval }; 
    MethodInfo mi = classType.GetMethod("MyMethod"); 
    mi.Invoke(obj, parameters); 
}); 
myThread.Start(); 

Код внутри delegate() { ... } является анонимным методом, который выполняется на новом потоке.

0

Просто предложение, почему бы не использовать. Net 4.0 Framework, имеет более легкую реализацию потоковой передачи. Просто используйте Parallel.For, Parallel.ForEach() или Parallel.Invoke(). Некоторые дополнительные объяснения здесь ->http://anyrest.wordpress.com/2010/09/09/parallel-programming-easier-than-ever-using-net-framework-4/

+0

Поскольку 'Parallel.Invoke' принимает делегаты' Action', которые не могут принимать аргументы, это на самом деле не отвечает на вопрос. Разумеется, использование библиотеки параллельных задач для управления threadpool - хорошая альтернатива «новой теме», но OP, похоже, не хочет использовать threadpool. –

 Смежные вопросы

  • Нет связанных вопросов^_^