C # работает InvokeMember в потоке - PullRequest
2 голосов
/ 06 июля 2011

так что я пытаюсь сделать, это запустить InvokeMember в потоке.Здесь есть информация, как это сделать: C #: вызвать метод с помощью [Type] .InvokeMember () в отдельном потоке

Так что мой код выглядит следующим образом, и это работает:

            Assembly OCA = Assembly.LoadFrom("./CardMax2.Elkart.OrderClutchAgent.dll");
            Type[] types = OCA.GetTypes();
            foreach (var type in types)
            {
                //MethodInfo[] methods = type.GetMethods();
                if (type.Name == "OrderClutchAgent")
                {
                    var obj = Activator.CreateInstance(type);
                    type.InvokeMember("RunAgent",BindingFlags.Default | BindingFlags.InvokeMethod,null,obj,null);
                }

            }

Теперь, когда я пытаюсь запустить его в потоке, код выглядит так:

            Assembly OCA = Assembly.LoadFrom("./CardMax2.Elkart.OrderClutchAgent.dll");
            Type[] types = OCA.GetTypes();
            foreach (var type in types)
            {
                //MethodInfo[] methods = type.GetMethods();
                if (type.Name == "OrderClutchAgent")
                {
                    var obj = Activator.CreateInstance(type);
                    Thread t = new Thread(delegate()
                                              {
                                                  type.InvokeMember("RunAgent", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null);
                                              });
                    t.Start();
                }

            }

Но с этим кодом я получаю странное исключение:

Method 'Org.BouncyCastle.Asn1.X509.TbsCertificateList+RevokedCertificatesEnumeration+RevokedCertificatesEnumerator.RunAgent' not found.

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

1 Ответ

3 голосов
/ 06 июля 2011

легендарная проблема захвата foreach - к тому моменту, когда она начинает вызывать ее (в другом потоке), переменная type ссылается на другую Type ...

Создатьвместо этого скопируйте:

foreach (var tmp in types)
{
    var type = tmp;
    // your code
}

Разница в том, что переменная цикла (type в вашем примере, tmp в моем) ограничена вне цикла (в соответствии со спецификацией)следовательно, для целей захвата это одна переменная , общая для всего цикла.Однако type в моем примере ограничено внутри цикла, поэтому (для целей захвата) обрабатывается как другая переменная на итерацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...