我目前有一些代码在对象上调用方法超过 1,000,000 次。此代码部分当前运行大约需要 2 分钟。此方法内部还有一个锁,其中包含长时间运行的代码,因此简单的并行执行将无法缩短执行时间。
class Rule
{
private readonly Jint.Engine _rule;
private readonly object _ruleLock;
public Rule(Jint.Engine rule)
{
this._rule = rule;
this._ruleLock = new object();
}
public void InvokeRule(object source, object target)
{
lock (_ruleLock)
{
_rule.Invoke("rule", source, target);
}
}
}
但是,我可以使用相同的规则代码创建这个对象的多个实例,因为里面的代码只是一个计算而不是有状态的。然而,生成多个实例也会对时间产生进一步的影响,因为 Jint.Engine.Execute() 也需要相对较长的时间来运行。
如果为同一规则创建多个实例,我还想确保只使用一个实例。
有没有办法创建类似的东西:
var rulesOfSameKind = new List<Rule>{
new Rule(new Jint.Engine().Execute(commonJSText)),
new Rule(new Jint.Engine().Execute(commonJSText))
}
return rules.OfSameKind.First(rule => rule.IsNotRunning).InvokeRule(source, target);
有点难以解释我的意思,但我基本上是在寻找一种方法来检查线程是否被锁定或正在运行,然后尝试下一个并从第一个线程返回一个值以便能够运行。