私は新しい非同期/待機機能を使用して、DBと非同期で作業しようとしています。リクエストの中には時間がかかるものがあるため、キャンセルできるようにしたいと考えています。私が実行している問題は、TransactionScope
は明らかにスレッドアフィニティを持っていることです。タスクをキャンセルすると、そのDispose()
が間違ったスレッドで実行されたようです。 UPDATEDTransactionScopeをキャンセル可能async/awaitで処理する方法は?
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();
// ...
//}
}
}
}
:コメントアウト部分があることに何かがあるのを示すことです。ここのコードです
"A TransactionScope must be disposed on the same thread that it was created."
:.TestTx()
を呼び出すとき
は具体的に、私はInvalidOperationException
task.Wait()
にAggregateException
を含む、以下を得ます接続が開かれた後は非同期で接続が完了しますが、そのコードを再現する必要はありません。
2つ目の点を詳しく説明してください。どこに創造物を移動しますか? – chase
次に、接続を非同期で開き、実際の作業負荷に対してブロッキング呼び出しを使用することをお勧めしますか?それとも、私は何かをもう一度見逃していますか – chase
現時点では、接続は非同期でしか取得できません。私はあなたの例に従ってきましたが、質問を実際のワークロードで更新すると、私の回答も更新することができます。 – Maarten