Hangfire: поставить в очередь фоновое задание из критической секции

Я получаю сообщение об ошибке при попытке поставить задание в очередь в операторе блокировки.

lock (lockObj)
{
    BackgroundJob.Enqueue(() => MyJob());
}

Он жалуется на отключение распределенных транзакций. Но я не хочу, чтобы мои блокировки влияли на обработку заданий. Если я включу MSDTC, будет ли он удерживать блокировку до завершения обработки задания? Это противоположно тому, что мне нужно.

Неудобно перемещать вызовы BackgroundJob.Enqueue() за пределы блока блокировки, потому что они могут находиться внутри другого метода, что затрудняет извлечение (реальные случаи намного сложнее):

lock (lockObj)
{
    MainWork();
    AnotherMethod();
    MoreWork();
}

private void AnotherMethod()
{
   BackgroundJob.Enqueue(() => MyJob());
   SomeWork();
}

Может ли кто-нибудь предложить рефакторинг/решение, которое мне нужно здесь?


person Ivan Zverev    schedule 16.02.2017    source источник
comment
Нет, блокировка будет снята после постановки в очередь, а не после завершения задания.   -  person VMAtm    schedule 18.02.2017


Ответы (1)


Выяснилось, что проблема была не из-за блокировки, а из-за использования TransactionScope. Итак, следующий код сделал свое дело:

private void AnotherMethod()
{
   using (var ts = new TransactionScope(TransactionScopeOption.Suppress))
   {
       BackgroundJob.Enqueue(() => MyJob());
       ts.Complete();
   }

   SomeWork();
}
person Ivan Zverev    schedule 20.02.2017