Есть ли способ выбрать задачу, которая в данный момент не выполняется, из списка задач? - PullRequest
0 голосов
/ 11 апреля 2019

В настоящее время у меня есть некоторый код, который вызывает метод для объекта, превышающего 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);

Немного сложно объяснить, что я имею в виду, но я в основном ищу способ проверить, заблокирован ли поток или работает, и попробовать следующий и вернуть значение из первого потока, чтобы иметь возможность работать.

...