gpt4 book ai didi

C# 在线程中运行 InvokeMember

转载 作者:行者123 更新时间:2023-11-30 22:37:13 24 4
gpt4 key购买 nike

所以我想做的是在线程中运行 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.

我是不是在做一些完全错误的事情,或者也许有人可以指出为什么我得到这个异常..

最佳答案

传说中的 foreach 捕获问题 - 当它开始调用它时(在不同的线程上),type 变量指的是不同的 Type ...

改为复制:

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

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

关于C# 在线程中运行 InvokeMember,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6595362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com