C#在线程中运行InvokeMember
所以我要做的是在线程中运行InvokeMember。在此处获得了如何操作的信息: 因此,我的代码现在看起来像这样,这是可行的:C#在线程中运行InvokeMember,c#,assemblies,C#,Assemblies,所以我要做的是在线程中运行InvokeMember。在此处获得了如何操作的信息: 因此,我的代码现在看起来像这样,这是可行的: Assembly OCA = Assembly.LoadFrom("./CardMax2.Elkart.OrderClutchAgent.dll"); Type[] types = OCA.GetTypes(); foreach (var type in types) {
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.
我是否做了一些完全错误的事情,或者也许有人可以指出我为什么会出现这种异常。传奇的
foreach
捕获问题-当它开始调用它时(在不同的线程上),type
变量引用了不同的类型
制作一份副本:
foreach (var tmp in types)
{
var type = tmp;
// your code
}
不同之处在于循环变量(type
在您的示例中,我的示例中是tmp
)的作用域在循环之外(根据规范),因此出于捕获目的,它是整个循环共用的单变量。但是,在我的示例中,type
的作用域在循环内部,因此(为了捕获目的)在每次迭代中被视为不同的变量。也许您可以在第二个线程上调用整个代码块,而不是单个方法调用。