2011-10-27 12 views
8

numaralı çağrıya yapılan toplama değişikliğinden dolayı bu gerçekten çok tuhaf bir halim var. Bu hiç bir zaman yakalayamadım (çok nadiren gerçekleşir). Temel olarak, çıkışta bilinmeyen bir istisna rastgele bir C# uygulaması var. Ben ayıklayıcısında bu sefer yakalamak idare ettik ve Application.Exit() çağırarak aşağıdaki iletiyle bir System.InvalidOperationException atma olduğu ortaya çıktı: tip system.data.dll 'Ilk şansını özel durum mscorlib oluştuSystem.InvalidOperationException Application.Exit()

. dll

Ek bilgi: Koleksiyon değiştirildi; numaralandırma işlemi yapılamayabilir.

Ben iddia edilen modifiye edilmiş bu koleksiyonun, ya kim bunu modifiye şeyin ne olduğunu emin değilim.

yığın izleme çok yararlı değildir:!

mscorlib.dll System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext() + 0x13f bayt System.Windows.Forms.dll System.Windows!. Forms.Application.ExitInternal() + 0x112 bayt System.Windows.Forms.dll! System.Windows.Forms.Application.Exit (System.ComponentModel.CancelEventArgs e) + 0x65 bayt

herhangi bir fikir nasıl Hangi ArrayList'in değiştirildiğini öğrenebilir misin? Açıkçası yaptığım bir şey olduğunu düşünmüyorum, büyük olasılıkla yaptığım bir işlem, MS'in beklemediği bir işlemin ortasında .NET çerçevesinin temelini değiştiren bir iştir ..

+0

Formlar koleksiyonu gibi görünüyor. IIRC Bunun daha önce olduğunu gördüm, ama herhangi bir detayı hatırlayamıyorum, üzgünüm. – leppie

+1

Uygulamanız kapatma sırasında ne yapıyor? Kodu verebilir misiniz? – Fischermaen

+0

Hiçbir şey, gerçekten ... Çıkış düğmesine bastığımda, uygulama boşta bir durumda, arka plan iş parçacığı veya aktivitesi çalışmıyordu. –

cevap

17

Sıra dışı Bunu daha önce hiç görmedim. Application.ExitInternal() yöntemi, Application.OpenForms koleksiyonunu yineler. Açıkça bu koleksiyon bunu yaparken değiştiriliyor. Bunun birkaç nedeni olabilir, sadece bir tane bulabilirim. Formlarınızdan biri OnFormClosing() yöntemini geçersiz kıldı veya FormClosing olayına abone oldu. Ve OpenForms koleksiyonunu değiştiren bir şey yapıyor. Form nesnesini veya yeni bir form örneği oluşturarak veya ShowInTaskbar gibi yeniden oluşturulmasına neden olan bir form özelliğini değiştirerek olabilir.

Bu kodu çağrı yığında bulamazsınız. On/FormClosing kodunuzu gözden geçirin. Hızlı bir şekilde bulamıyorsanız yorum yapın.

+0

Bazen ileti kutularını açabilen oldukça karışık FormClosing kodum var. Her halükarda, Application.Exit() 'tan this.Close()' a geçerek, FormClosing'in içeriğini değiştirmeme gerek kalmaksızın sorunların etrafında çalışmış gibi görünmektedir. –

+2

@Hans Passant, aynı konuya sahip; ve yeterince emin, 'Form_CLOSING' yöntemimde bir mesaj kutusu görüntüledim. Ve bom, aynı toplama değişikliği. Ne kadar aptalca. Form_CLOSED'e taşındı ve iyi. Kinda garip ama hey, sonuçta bravo. –

+1

Bu tam olarak benim de sorun oldu, OnClosing bir MessageBox Application.Exit açık formlar yineleyici geçersiz kılıyordu. OnClosed'e taşınması düzeltildi! – Blindy

0

Bu soruna da günlerimizi harcadık ... 'System.InvalidOperationException' istisnası ve uygulama (bu durumda DynamSoft'tan bir twain kütüphanesi kullanılarak). Görünüşe göre, application.exit çağrıldıktan sonra CLOSE() 'ı çağırmamalıydık. Kapat'ı yorumlamak istisnayı ortadan kaldırdı ve uygulamayı normal olarak tamamladı. Görsel olarak, uygulama, Microsoft'tan "bu sorun hakkında daha fazla bilgi göndermek ister misiniz?" Diyen garip bir mesaj kutusu görüntülerdi - NE SORUN? Bundan önce hiçbir şey göstermedi, bu yüzden yığın izleriyle kazmaya gittik.

   Utils.Logger.Info("", "AsystScanner/dynamicDotNetTwain2_OnPostAllTransfers"); 
       Utils.Logger.Info("Closing down application!", "AsystScanner/dynamicDotNetTwain2_OnPostAllTransfers"); 

       // caller should close down app, added 3/3/15 
       dynamicDotNetTwain2.CloseSource(); 
       dynamicDotNetTwain2.CloseSourceManager(); 

       System.Windows.Forms.Application.Exit(); 
no no! don't do a close here. 
       //try 
       //{ 
       // Close(); 
       //} 
       //catch (Exception ex) 
       //{ 
       // MessageBox.Show(ex.Message + " Routine=dynamicDotNetTwain2_OnPostAllTransfers/Close() statement failed. [EJS1503031630]"); 
       //} 
       return; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message + " Routine=dynamicDotNetTwain2_OnPostAllTransfers [EJS1503031631]"); 
      } 
İlgili konular