Ich versuche, die neue async/await-Funktion zu verwenden, um asynchron mit einer DB zu arbeiten. Da einige der Anfragen langwierig sein können, möchte ich sie abbrechen können. Das Problem, das ich renne ist, dass TransactionScope
offenbar eine Thread-Affinität hat, und es scheint, dass beim Abbrechen der Aufgabe, Dispose()
wird auf einem falschen Thread gelaufen.Wie man TransactionScope in annullierbar async/warten?
Insbesondere wenn .TestTx()
Aufruf erhalte ich die folgende AggregateException
enthält InvalidOperationException
auf task.Wait()
:
"A TransactionScope must be disposed on the same thread that it was created."
Hier ist der Code ist:
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: die auf Kommentar Teil etwas zu zeigen, ist es zu sein asynchron - mit der Verbindung, sobald es geöffnet ist, aber dieser Code ist nicht erforderlich, das Problem zu reproduzieren.
Können Sie Ihren zweiten Punkt näher erläutern? Verschieben Sie die Kreation wo? – chase
Würden Sie dann vorschlagen, die Verbindung nur asynchron zu öffnen und blockierende Aufrufe für die tatsächliche Arbeitsauslastung zu verwenden? Oder verpasse ich noch etwas? – chase
Im Moment in Ihrer Frage erwerben Sie nur die Verbindung asynchron. Ich bin Ihrem Beispiel gefolgt, aber wenn Sie Ihre Frage mit einer tatsächlichen Arbeitslast aktualisieren, kann ich auch meine Antwort aktualisieren. – Maarten