Wie unterstütze ich asynchrone Methoden in einem TransactionScope mit Microsoft.Bcl.Async in .NET 4.0?
Ich habe eine ähnliche Methode wie:
public async Task SaveItemsAsync(IEnumerable<MyItem> items)
{
using (var ts = new TransactionScope())
{
foreach (var item in items)
{
await _repository.SaveItemAsync(item);
}
await _repository.DoSomethingElse();
ts.Complete();
}
}
Dies hat natürlich Probleme, weilTransactionScope
spielt nicht gut mit async / await.
Es scheitert mit einemInvalidOperationException
mit der Nachricht:
"Ein TransactionScope muss sich in demselben Thread befinden, in dem es erstellt wurde."
ich lese überTransactionScopeAsyncFlowOption
imdiese AntwortDas scheint genau das zu sein, was ich brauche.
Für dieses spezielle Projekt muss ich jedoch unbedingt .NET 4.0 unterstützen und kann kein Upgrade auf 4.5 oder 4.5.1 durchführen. Das asynchrone Verhalten in meinem Projekt wird also durch das bereitgestelltMicrosoft.Bcl.Async NuGet-Paket.
Ich kann nicht scheinen zu findenTransactionScopeAsyncFlowOption
in diesem oder irgendeinem anderenOOB-Paket. Vermisse ich es nur irgendwo?
Wenn es nicht verfügbar ist, gibt es eine Alternative, um das gleiche Ergebnis zu erzielen? Das heißt, ich möchte, dass der Transaktionsbereich ordnungsgemäß abgeschlossen oder zurückgesetzt wird, obwohl Threads mit Fortsetzungen gekreuzt werden.
Ich fügte hinzuDoSomethingElse
Um zu veranschaulichen, dass innerhalb des Transaktionsbereichs möglicherweise mehrere Aufrufe erforderlich sind, ist es daher nicht sinnvoll, alle Elemente in einem Aufruf an die Datenbank zu übergeben.
Falls es darauf ankommt, verwendet das Repository direkt ADO.Net (SqlConnection
, SqlCommand
, etc) um auf einen SQL Server zu schreiben.
AKTUALISIEREN
Ich dachte, ich hätte eine Lösung, bei der ich System.Transactions.dll aus .Net 4.5.1 genommen und in mein Projekt aufgenommen habe. Allerdings stellte ich fest, dass dies nur auf meiner Dev-Box funktionierte, da dort bereits 4.5.1 installiert war. Bei der Bereitstellung auf einem Computer mit nur .Net 4.0 funktionierte dies nicht. Es gab nur eineMissingMethodException
. Ich suche nach einer Lösung, die auf einer .Net 4.0-Installation funktioniert.