2011-10-27 4 views
8

Ho questo errore davvero, davvero strano che non sono mai stato in grado di definire (accade molto raramente). Fondamentalmente, ho un'applicazione C# che lanciava casualmente un'eccezione sconosciuta all'uscita. Sono riuscito a prenderlo nel debugger questa volta, e si scopre che la chiamata Application.Exit() è gettando un System.InvalidOperationException con il seguente messaggio:System.InvalidOperationException a causa di una modifica della raccolta sulla chiamata a Application.Exit()

Una prima eccezione di possibilità di tipo 'System.InvalidOperationException' in mscorlib. dll

Informazioni aggiuntive: la raccolta è stata modificata; l'operazione di enumerazione potrebbe non essere eseguita.

non sono sicuro che cosa questa collezione che è stata presumibilmente modificato è, o chi era colui che modificò.

L'analisi dello stack non è molto utile:!

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

Qualsiasi idea di come mi puoi scoprire quale ArrayList è stato modificato? Non penso che sia qualcosa che sto facendo esplicitamente, più probabilmente un'azione che sto facendo che modifica lo stato sottostante del framework .NET nel mezzo di un'operazione che MS non si aspettava ..

+0

Sembra la collezione Forms. IIRC Ho visto questo accadere prima, ma non ricordo alcun dettaglio, mi dispiace. – leppie

+1

Cosa sta facendo la tua applicazione allo spegnimento? La prego di fornire il codice. – Fischermaen

+0

Niente, davvero ... Al momento in cui ho premuto il pulsante di uscita, l'applicazione era in uno stato inattivo, senza thread in background o attività in esecuzione. –

risposta

17

Insolito , mai visto prima. Il metodo Application.ExitInternal() itera la raccolta Application.OpenForms. Chiaramente questa raccolta viene modificata mentre lo fa. Ci sono poche cause possibili per questo, posso solo inventarne uno. Uno dei moduli ha sovrascritto il metodo OnFormClosing() o ha sottoscritto l'evento FormClosing. E sta facendo qualcosa che modifica la collezione OpenForms. Potrebbe essere lo smaltimento dell'oggetto modulo o la creazione di una nuova istanza modulo o la modifica di una proprietà modulo che provoca la ricreazione della finestra, come ShowInTaskbar.

Non si troverà questo codice nello stack di chiamate. Controlla il tuo codice On/FormClosing. Scrivi un commento se non riesci a trovarlo rapidamente.

+0

Ho un codice FormClosing piuttosto contorto che a volte apre finestre di messaggio. In ogni caso, il passaggio da Application.Exit() a this.Close() sembra aver risolto i problemi senza richiedere la modifica dei contenuti di FormClosing. –

+2

@Hans Passant, avendo lo stesso identico problema; e abbastanza sicuro, ho visualizzato una finestra di messaggio nel mio metodo 'Form_CLOSING'. E boom, stessa modifica della collezione. Che stupido. Spostato in 'Form_CLOSED' e buono. Un po 'strano, ma hey, bravo su quel risultato. –

+1

Questo era esattamente il mio problema, un MessageBox in OnClosing ha invalidato l'Application.Exit open form iterator. Spostandolo su OnClosed l'ho risolto! – Blindy

0

Abbiamo trascorso giorni anche su questo problema ... dove abbiamo ottenuto l'eccezione "System.InvalidOperationException" e l'app (in questo caso utilizzando una libreria twain di DynamSoft). Apparentemente non avremmo dovuto chiamare CLOSE() dopo aver chiamato application.exit. Commentando la chiusura, l'eccezione si è interrotta e l'app si è conclusa normalmente. Visivamente, l'app mostrerebbe una strana finestra di messaggi da Microsoft che diceva "ti piacerebbe inviare ulteriori informazioni su questo problema" - CHE PROBLEMA? non ha mostrato nulla prima di questo, quindi siamo andati a scavare tra le tracce dello stack.

   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]"); 
      }