2017-02-16 2 views
2

Ich erhalte einen Fehler beim Versuch, einen Job in eine Sperranweisung zu stellen.Hangfire: Hintergrundjob innerhalb eines kritischen Abschnitts in die Warteschlange stellen

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

Es beschwert sich, dass verteilte Transaktionen deaktiviert werden. Aber ich möchte nicht, dass meine Sperren Einfluss auf die Jobverarbeitung haben. Wenn ich MSDTC aktiviere, wird es die Sperre beibehalten, bis die Jobverarbeitung abgeschlossen ist? Es ist das Gegenteil von dem, was ich brauche.

Es ist nicht bequem BackgroundJob.Enqueue() Anrufe außerhalb des Sperrblock zu bewegen, weil sie in einem anderen Verfahren sein könnte, die es schwer zu extrahieren (realen Fällen viel schwieriger) macht:

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

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

Könnte jemand bitte Refactoring vorschlagen/Lösung brauche ich hier?

+1

Nein, Sperre würde nach dem Einreihen freigegeben werden, nicht nach Abschluss des Auftrags – VMAtm

Antwort

2

Offenbart, dass das Problem nicht wegen der Sperre, sondern wegen der Verwendung von TransactionScope war. Also der nächste Code hat den Trick:

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

    SomeWork(); 
} 
Verwandte Themen