Visual Studio: ContextSwitchDeadlock


167

Çözemediğim bir hata mesajı alıyorum. Visual Studio veya hata ayıklayıcıdan kaynaklanır. Nihai hata durumu VS, hata ayıklayıcı, benim program veya veritabanı olup olmadığından emin değilim.

Bu bir Windows uygulamasıdır. Bir web uygulaması değil.

VS'den gelen ilk mesaj, "Herhangi bir çağrı yığını çerçevesi için hiçbir sembol yüklenmedi. Kaynak kodu görüntülenemiyor." Bu tıklatıldığında, elde: " ContextSwitchDeadlock tespit edildi ", aşağıda uzun bir mesaj ile birlikte.

Hata, bir DataTable'ı tarayan bir döngüde ortaya çıkar. Her satır için, tablodan bir SqlCommand parametresi olarak bir anahtar (HIC #) değeri kullanır. Komut, bir satır döndüren bir SqlDataReader oluşturmak için kullanılır. Veriler karşılaştırılır. Bir hata algılanırsa, ikinci bir DataTable'a bir satır eklenir.

Hata, prosedürün ne kadar sürdüğüyle (yani 60 saniye sonra), kaç hata bulunduğuyla ilişkili görünmemektedir. Bunun bir hafıza sorunu olduğunu düşünmüyorum. Döngü içinde hiçbir değişken bildirilmez. Oluşturulan tek nesneler SqlDataReaders vardır ve bunlar Yapıları kullanmaktadır. Add System.GC.Collect () etkisi olmadı.

Db aynı dizüstü bilgisayarda bir SqlServer sitesidir.

Formda süslü bir gizem veya alet yoktur.

Daha önce onlarca kez yaptığımdan çok farklı olan bu süreçte hiçbir şeyin farkında değilim. Hatayı daha önce gördüm, ama asla tutarlı bir temelde olmadı.

Herhangi bir fikir var mı?

Tam hata metni: CLR, 60 saniye boyunca COM bağlamı 0x1a0b88'den COM bağlamı 0x1a0cf8'e geçiş yapamadı. Hedef içeriğe / daireye sahip olan iş parçacığı büyük olasılıkla ya pompalamayan bir bekleme yapıyor ya da Windows iletilerini pompalamadan çok uzun süre çalışan bir işlem yapıyor. Bu durum genellikle performans üzerinde olumsuz bir etkiye sahiptir ve uygulamanın zaman içinde sürekli olarak birikmesine veya bellek kullanımının birikmesine neden olabilir. Bu sorunu önlemek için, tüm tek iş parçacıklı grup (STA) iş parçacıkları pompalama bekleme ilkelleri (CoWaitForMultipleHandles gibi) kullanmalı ve uzun çalışma işlemleri sırasında mesajları düzenli olarak pompalamalıdır.

Yanıtlar:


287

Bu ContextSwitchDeadlock, kodunuzun bir sorunu olduğu anlamına gelmez, sadece bir potansiyel vardır. Eğer giderseniz Debug > Exceptionsmenüsünde ve genişletmek Managed Debugging Assistants, bulacaksın ContextSwitchDeadlocketkindir. Bunu devre dışı bırakırsanız, öğelerin işlenmesi uzun sürdüğünde VS artık sizi uyarmaz. Bazı durumlarda geçerli olarak uzun süreli bir işleminiz olabilir. Hata ayıklama yapıyorsanız ve bu işlem sırasında bir satırda durduysanız da yararlıdır - bir soruna girme şansınız olmadan şikayet etmesini istemezsiniz.


4
Kesinlikle doğru! Teşekkürler. Özelleştir'e gitmek ve Hata Ayıklama menüsüne Özel Durumlar eklemek zorunda kaldım. Kullanıcı arayüzünün en sezgisel yönü değil. Araçlar \ Özelleştir, ardından Komutları Yeniden Yerleştir (düğme), ardından sağ üstteki açılır menüden Hata Ayıkla'yı seçin, ardından Ekle (düğme). Whew!
SeaDrive

81
ctrl-alt-eistisna iletişim kutusunu getirir.
Florian Doyon

1
Visual Studio'nun (2012, 2010, 2008) daha yeni sürümlerinin çoğu ve muhtemelen daha önceki bazı sürümleri, kurulumdan sonra ilk çalıştırıldığında Visual Studio'nun birincil kullanımını seçmesine izin verir. Bu seçim, hangi kontrollerin görünür veya gizli olduğunu ve hatta hangi tuş vuruşlarının hangi komutlara karşılık geldiğini içeren araç çubuklarının varsayılan düzenini belirler. VS 2010'da, Alma ve Verme Sihirbazı, kullanılabilir varsayılanlardan birine sıfırlamanızı sağlar.
Zarepheth

4
@ B.ClayShannon - ContextSwitchDeadlock hata ayıklayıcıya özgüdür. Exe'nin yayın sürümü bu mesajı görüntülemez.
Pedro

9
VS 2013'te ile gezin Debug -> Windows -> Exceptions Settings. Sonra aramayı kullanın
Markus Weber

16

Pedro'nun dediği gibi, kod boyunca adım atıyorsanız hata ayıklayıcı ile mesaj pompasını önleyen bir sorununuz var.

Ancak UI iş parçacığında uzun süre çalışan bir işlem gerçekleştiriyorsanız, ileti sırasını açıkça pompalayan ve sonra da geçerli yönteminize denetim döndüren Application.DoEvents () öğesini çağırın.

Ancak bunu yapıyorsanız, UI iş parçacığının güzel ve çabuk kalması için UI iş parçacığından işlem yapabilmeniz için tasarımınıza bakmanızı tavsiye ederim.


14

Uygulamadaki ana UI iş parçacığında bunu yapıyormuşsunuz gibi geliyor. UI iş parçacığı, Windows iletilerinin gelmesi olarak pompalanmasından sorumludur ve yine de sizinki veritabanı çağrılarında engellendiğinden bunu yapamaz. Bu, sistem genelindeki iletilerde sorunlara neden olabilir.

Uzun süren işlem için arka plan iş parçacığı oluşturmaya ve kullanıcı için bir tür "Meşgul" iletişim kutusu oluşturmaya bakmalısınız.


13

Visual Studio 2017'de ContextSwitchDeadlock seçeneğinin işaretini kaldırın:

Hata ayıklama> Windows> İstisna Ayarları

resim açıklamasını buraya girin

İstisna Ayarı Windows'da: ContextSwitchDeadlock seçeneğinin işaretini kaldırın

resim açıklamasını buraya girin


9

Bu özel durumu devre dışı bırakmak istemiyorsanız, yapmanız gereken tek şey uygulamanızın en az 60 saniyede bir kez bazı iletileri pompalamasına izin vermektir. Bu istisnanın gerçekleşmesini önleyecektir. Arada bir System.Threading.Thread.CurrentThread.Join (10) öğesini aramayı deneyin. Mesajların pompalanmasına izin veren başka aramalar da var.


Bunun neden yardımcı olduğunu açıklayabilir misiniz?
rulolar

Bu işe yaramaz, ben UI güncelleme bir döngü var ve hala hata mesajı almak.
htm11h

1
10 milisaniyelik bir değer kullanmaya gerek yoktur, aslında uzun süren bir operasyonda tekrar tekrar çağırmak istiyorsanız, genel performansı (toplam süre yürütme) çok azaltacaktır. Sadece sıfıra geçin.
ElektroStudios

Benzer bir sorun yaşadım. Çözümünüzü çalışıyor olarak buldunuz. Teşekkürler!
Sk Shahnawaz-ul Haque

2

Yukarıdaki çözüm bazı senaryolarda iyidir, ancak birim sınama yaptığınızda bunun gerçekleştiği başka bir senaryo vardır ve çözüm Hata Ayıklama olarak ayarlanmadığında Test Gezgini'nden "Seçili Sınamalarda Hata Ayıkla" seçeneğini deneyin.

Bu durumda, çözümünüzü Release'den veya bu durumda ne olursa olsun Debug olarak ayarlamanız gerekir. Sorun buysa, "ContextSwitchDeadlock" öğesini değiştirmek size gerçekten yardımcı olmaz.

Hata iletisi çok kötü olduğu için bu kendimi kaçırdım Hata ayıklama ayarı olan bariz şey kontrol etmedi!


1

Visual Studio 2017 İspanyolca sürümünde.

"Depurar" -> "Ventanas" -> "Excepciones Yapılandırması"

ve "ContextSwitchDeadlock" araması yapın. Ardından, işaretini kaldırın. Veya kısayol

Kontrol D, E

En iyi.


0

Bunu, bağlam anahtarlarının işaretini kaldırarak çözebilirsiniz.

Hata ayıklama-> İstisnalar ... -> MDA düğümünü genişlet -> işaretini kaldır -> contextswitchdeadlock


0

Bu hatayı alıyordum ve async (await (...). ToListAsync ()) sorguları değiştirdi. Şimdi her şey yolunda.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.