System.Reflection.MethodInfo.Invoke и несколько потоков - PullRequest
4 голосов
/ 13 сентября 2010

Привет, как мне вызвать 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.. ????**

Ответы [ 3 ]

11 голосов
/ 13 сентября 2010

Поскольку вы хотите создать новый поток с помощью System.Threading.Thread, а не выполнять вызов в существующем потоке пользовательского интерфейса или в потоке потоков, первое, на что нужно обратить внимание, это то, что с System.Threading.Thread вы можете использовать либо 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);

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

2 голосов
/ 13 сентября 2010

Вы можете запустить поток с помощью анонимного метода:

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 голосов
/ 13 сентября 2010

Просто предложение, почему бы не использовать .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/

...