有没有办法从任务列表中选择当前未运行的任务?

时间:2019-04-11 12:40:24

标签: c# multithreading task jint

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

0 个答案:

没有答案