Wie entsorge ich TransactionScope in abbrechbarem asynchronem / Warten?
Ich versuche, die neue asynchrone / Warte-Funktion zu verwenden, um asynchron mit einer Datenbank zu arbeiten. Da einige Anfragen langwierig sein können, möchte ich sie stornieren können. Das Problem, auf das ich stoße, ist dasTransactionScope
hat offenbar eine Thread-Affinität, und es scheint, dass beim Abbrechen der Aufgabe seineDispose()
ruft einen falschen Thread auf.
Insbesondere beim Anrufen.TestTx()
Ich bekomme folgendesAggregateException
enthältInvalidOperationException
auftask.Wait ()
:
"A TransactionScope must be disposed on the same thread that it was created."
Hier ist der Code:
public void TestTx () {
var cancellation = new CancellationTokenSource ();
var task = TestTxAsync ( cancellation.Token );
cancellation.Cancel ();
task.Wait ();
}
private async Task TestTxAsync ( CancellationToken cancellationToken ) {
using ( var scope = new TransactionScope () ) {
using ( var connection = new SqlConnection ( m_ConnectionString ) ) {
await connection.OpenAsync ( cancellationToken );
//using ( var command = new SqlCommand ( ... , connection ) ) {
// await command.ExecuteReaderAsync ();
// ...
//}
}
}
}
AKTUALISIERT: Der auskommentierte Teil soll zeigen, dass - asynchron - mit der Verbindung etwas zu tun ist, sobald sie geöffnet ist. Dieser Code ist jedoch nicht erforderlich, um das Problem zu reproduzieren.