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.