C#在线程中运行InvokeMember

时间:2011-07-06 11:05:00

标签: c# assemblies

所以我尝试做的是在一个线程中运行InvokeMember。在此处获取了如何操作的信息:C# : Invoke a method with [Type].InvokeMember() in a separate Thread

所以我的代码现在看起来像这样,这有效:

            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 个答案:

答案 0 :(得分:3)

传奇的foreach捕获问题 - 当它调用它时(在不同的线程上),type变量引用不同的Type ...

改为复制:

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

不同之处在于循环变量(示例中为type,我的tmp)的范围循环外(根据规范),因此用于捕获目的是它是整个循环共有的单变量。但是,我的示例中的type在循环中作为范围,因此(出于捕获目的)每次迭代都被视为不同的变量。