2017-02-16 9 views
2

ロックステートメント内でジョブをエンキューしようとするとエラーが発生します。Hangfire:クリティカルセクションの内部からバックグラウンドジョブをエンキューします

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

分散トランザクションが無効になっていると言う。しかし私はロックが仕事の処理に影響を及ぼさないようにしています。 MSDTCを有効にすると、ジョブ処理が完了するまでロックが保持されますか?それは私が必要とするものの反対です。

それはそれは難しい(はるかに困難実際の例)を抽出することができ、別の方法で内側にある可能性があるため、ロックブロックの外BackgroundJob.Enqueue()呼び出しを移動することが便利ではありません。

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

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

誰でもリファクタリングを提案してもらえ/私がここに必要な解決策?

+1

いいえ、ロックはジョブを終了した後ではなく、エンキュー後に解放されます – VMAtm

答えて

2

問題がロックのためではなく、TransactionScopeを使用していることが明らかになりました。したがって、次のコードではこのトリックが行われました。

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

    SomeWork(); 
} 
関連する問題