Saya mendapatkan pesan kesalahan yang tidak bisa saya selesaikan. Itu berasal dari Visual Studio atau debugger. Saya tidak yakin apakah kondisi kesalahan pamungkas ada di VS, debugger, program saya, atau database.
Ini adalah aplikasi Windows. Bukan aplikasi web.
Pesan pertama dari VS adalah kotak sembulan yang mengatakan: "Tidak ada simbol yang dimuat untuk bingkai tumpukan panggilan apa pun. Kode sumber tidak dapat ditampilkan." Ketika itu diklik, saya mendapatkan: " ContextSwitchDeadlock terdeteksi ", bersama dengan pesan panjang yang direproduksi di bawah.
Kesalahan muncul dalam satu loop yang memindai DataTable. Untuk setiap baris, ia menggunakan nilai kunci (HIC #) dari tabel sebagai parameter untuk SqlCommand. Perintah ini digunakan untuk membuat SqlDataReader yang mengembalikan satu baris. Data dibandingkan. Jika kesalahan terdeteksi, baris ditambahkan ke DataTable kedua.
Kesalahan tampaknya terkait dengan berapa lama prosedur berjalan (yaitu setelah 60 detik), bukan berapa banyak kesalahan yang ditemukan. Saya tidak berpikir itu masalah memori. Tidak ada variabel yang dideklarasikan dalam loop. Satu-satunya objek yang dibuat adalah SqlDataReaders, dan mereka menggunakan struktur. Tambahkan System.GC.Collect () tidak berpengaruh.
Db adalah situs SqlServer di laptop yang sama.
Tidak ada alat mewah atau gadget di Formulir.
Saya tidak mengetahui apa-apa dalam proc ini yang sangat berbeda dari apa yang telah saya lakukan puluhan kali sebelumnya. Saya telah melihat kesalahan sebelumnya, tetapi tidak pernah secara konsisten.
Ada ide, siapa saja?
Teks kesalahan penuh: CLR tidak dapat beralih dari konteks COM 0x1a0b88 ke konteks COM 0x1a0cf8 selama 60 detik. Utas yang memiliki konteks tujuan / apartemen kemungkinan besar melakukan menunggu tanpa memompa atau memproses operasi yang berjalan sangat lama tanpa memompa pesan Windows. Situasi ini umumnya memiliki dampak kinerja negatif dan bahkan dapat menyebabkan aplikasi menjadi tidak responsif atau penggunaan memori menumpuk terus-menerus dari waktu ke waktu. Untuk menghindari masalah ini, semua utas apartemen ulir tunggal (STA) harus menggunakan primitif menunggu pemompaan (seperti CoWaitForMultipleHandles) dan secara rutin memompa pesan selama operasi yang berjalan lama.
sumber
ctrl-alt-e
membawa dialog pengecualian.Debug -> Windows -> Exceptions Settings
. Kemudian gunakan pencarianSeperti kata Pedro, Anda memiliki masalah dengan debugger yang mencegah pompa pesan jika Anda melangkah melalui kode.
Tetapi jika Anda melakukan operasi yang berjalan lama pada utas UI, maka panggil Application.DoEvents () yang secara eksplisit memompa antrian pesan dan kemudian mengembalikan kontrol ke metode Anda saat ini.
Namun jika Anda melakukan ini, saya akan merekomendasikan untuk melihat desain Anda sehingga Anda dapat melakukan pemrosesan dari thread UI sehingga UI Anda tetap bagus dan cepat.
sumber
Sepertinya Anda melakukan ini pada utas UI utama di aplikasi. Utas UI bertanggung jawab untuk memompakan pesan windows sebagai kedatangan, namun karena Anda diblokir dalam panggilan basis data, ia tidak dapat melakukannya. Ini dapat menyebabkan masalah dengan pesan di seluruh sistem.
Anda harus melihat pemunculan utas latar belakang untuk operasi yang berjalan lama dan memasang semacam dialog "Saya sibuk" untuk pengguna saat itu terjadi.
sumber
Di Visual Studio 2017, hapus centang opsi ContextSwitchDeadlock oleh:
Debug> Windows> Pengaturan Pengecualian
Dalam Pengecualian Pengaturan Windows: Hapus centang opsi ContextSwitchDeadlock
sumber
Jika Anda tidak ingin menonaktifkan pengecualian ini, yang perlu Anda lakukan adalah membiarkan aplikasi Anda memompa beberapa pesan setidaknya sekali setiap 60 detik. Ini akan mencegah pengecualian ini terjadi. Coba panggil System.Threading.Thread.CurrentThread.Join (10) sesekali. Ada panggilan lain yang dapat Anda lakukan agar pesan memompa.
sumber
Solusi di atas baik dalam beberapa skenario tetapi ada skenario lain di mana ini terjadi ketika Anda menguji unit dan Anda mencoba "Debug Selected Tests" dari Test Explorer ketika solusi Anda tidak disetel ke Debug.
Dalam hal ini Anda perlu mengubah solusi Anda dari Release atau apa pun itu diatur ke Debug dalam kasus ini. Jika ini masalahnya, maka mengubah "ContextSwitchDeadlock" tidak akan membantu Anda.
Saya melewatkan ini sendiri karena pesan kesalahannya sangat buruk sehingga saya tidak memeriksa hal yang sudah jelas yaitu pengaturan Debug!
sumber
Dalam Visual Studio 2017 versi Spanyol.
dan cari "ContextSwitchDeadlock". Lalu, hapus centang. Atau jalan pintas
Terbaik.
sumber
Anda dapat menyelesaikan ini dengan menghapus centang pada kontekstandar yang terkunci dari
Debug-> Pengecualian ... -> Perluas simpul MDA -> hapus centang -> contextswitchdeadlock
sumber
Saya mendapatkan kesalahan ini dan mengalihkan kueri ke async (tunggu (...). ToListAsync ()). Semuanya baik sekarang.
sumber