0

我目前有一些代码在对象上调用方法超过 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);

有点难以解释我的意思,但我基本上是在寻找一种方法来检查线程是否被锁定或正在运行,然后尝试下一个并从第一个线程返回一个值以便能够运行。

4

0 回答 0