System.Reflection.MethodInfo.Invoke и несколько потоков (с типом возврата) - PullRequest
0 голосов
/ 25 января 2011

Я просматривал другие вопросы на сайте и нашел это сообщение.

переполнение стека оригинальное сообщение

Бен Фойгтс ответ очень полезен, и яполагаю, что он работает в моей системе.

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

Я собирался просто оставитьпрокомментируйте этот пост, но мой представитель недостаточно высок, чтобы оставлять комментарии.

Надеюсь, что Бен увидит этот пост, или кто-то другой сможет расширить свой ответ, включив способ возврата значения.

Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация.

С уважением

Ясень

1 Ответ

1 голос
/ 25 января 2011

У вас есть два варианта. Либо вы вызываете MethodInfo.Invoke синхронно и ждете результата. Или вы устанавливаете метод обратного вызова для вызова после завершения вызова. Исходя из примера, на который вы ссылались:

public void InvokeOnNewThread(MethodInfo mi, object target, Action<object> callback, params object[] parameters)
{
     ThreadStart threadMain = delegate () 
        { 
            var res = mi.Invoke(target, parameters); 
            if(callback != null)
                callback(res);
        };
     new System.Threading.Thread(threadMain).Start();
}

Я добавил дополнительный параметр, который принимает делегата, который будет вызываться после завершения вызова. Тогда вы можете использовать это так:

void Main()
{
    var test = new Test();
    var mi = test.GetType().GetMethod("Hello");
    InvokeOnNewThread(mi, test, GetResult);


    Thread.Sleep(1000);
}

public void GetResult(object obj) 
{
    Console.WriteLine(obj);
}
...