Saya mencoba untuk mengintegrasikan async
/ await
ke dalam bus layanan kami. Saya menerapkan SingleThreadSynchronizationContext
berdasarkan contoh ini http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx .
Dan bekerja dengan baik, kecuali untuk satu hal: TransactionScope
. Saya menunggu hal-hal di dalam TransactionScope
dan itu merusak TransactionScope
.
TransactionScope
sepertinya tidak cocok dengan async
/ await
, tentu saja karena ia menyimpan sesuatu di utas menggunakan ThreadStaticAttribute
. Saya mendapatkan pengecualian ini:
"TransactionScope salah bertumpuk.".
Saya mencoba menyimpan TransactionScope
data sebelum mengantri tugas dan memulihkannya sebelum menjalankannya tetapi tampaknya tidak mengubah apa pun. Dan TransactionScope
kode itu berantakan, jadi sangat sulit untuk memahami apa yang terjadi di sana.
Apakah ada cara untuk membuatnya berhasil? Apakah ada alternatif lain TransactionScope
?
SingleThreadSynchronizationContext
untuk setiap level teratasTransactionScope
.Jawaban:
Di .NETFramework 4.5.1, ada sekumpulan konstruktor baru
TransactionScope
yang mengambilTransactionScopeAsyncFlowOption
parameter.Menurut MSDN, ini memungkinkan aliran transaksi melintasi kelanjutan utas.
Pemahaman saya adalah bahwa ini dimaksudkan untuk memungkinkan Anda menulis kode seperti ini:
sumber
Agak terlambat untuk mendapatkan jawaban tetapi saya mengalami masalah yang sama dengan MVC4 dan saya memperbarui proyek saya dari 4.5 menjadi 4.5.1 dengan mengklik kanan pada proyek, buka properti. Pilih tab aplikasi, ubah kerangka target ke 4.5.1 dan gunakan transaksi sebagai berikut.
sumber
Anda dapat menggunakan metode DependentTransaction yang dibuat oleh Transaction.DependentClone () :
Mengelola Concurrency dengan DependentTransaction
http://adamprescott.net/2012/10/04/transactionscope-in-multi-threaded-applications/
sumber
await Task.Delay(500)
pola ini juga akan gagalTransactionScope nested incorrectly
karena TransactionScope terluar (tidak ditampilkan dalam contoh di atas) keluar dari cakupan sebelum tugas turunan selesai dengan benar. Gantiawait
denganTask.Wait()
dan berhasil, tetapi kemudian Anda kehilangan manfaatasync
.