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