Yeni asenkron/bekletme özelliğini bir DB ile eşzamansız olarak çalışmak için kullanıyorum. Bazı talepler uzun olabileceğinden, bunları iptal edebilmek istiyorum. İçinde bulunduğum sorun şu ki, TransactionScope
görünen bir iş parçacığı afinitesine sahip ve görevin iptal edilmesi durumunda, onun Dispose()
yanlış bir iş parçacığı üzerinde çalıştığı görünüyor. GÜNCELLEMETransactionScope canceble async/standında nasıl kullanılır?
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();
// ...
//}
}
}
}
: dışarı yorumladı parçası olmak bir şey var göstermektir İşte kod
"A TransactionScope must be disposed on the same thread that it was created."
: .TestTx()
çağrılırken
Özellikle, InvalidOperationException
task.Wait()
üzerinde AggregateException
içeren aşağıdaki olsun - eşzamansız olarak - açık olduğunda bağlantı ile yapılır, ancak bu kodu, sorunu yeniden üretmek için gerekli değildir.
İkinci noktanızı detaylandırır mısınız? Yaratılışı nereye taşıyalım? – chase
Bağlantıyı yalnızca senkronize olmayan bir şekilde açmayı ve gerçek iş yükü için çağrıları engellemeyi mi önerirsiniz? Yoksa yine bir şeyi özlüyorum mu? – chase
Sorunuzdaki anda, bağlantıyı yalnızca senkronize olmayan bir şekilde edinebilirsiniz. Örneğinizi takip ettim, ancak sorunuzu gerçek bir iş yüküyle güncellerseniz, cevabımı da güncelleyebilirim. – Maarten