我目前有一些代码在对象上调用方法的次数超过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);
有点难以解释我的意思,但我基本上是在寻找一种方法来检查线程是否已锁定或正在运行,然后尝试下一个线程并从第一个线程返回值以使其能够运行。 / p>