2011-10-27 14 views
8

Tengo este realmente, muy extraño error que nunca he sido capaz de precisar (ocurre muy raramente). Básicamente, tengo una aplicación C# que arrojaba aleatoriamente una excepción desconocida al salir. He conseguido atraparlo en el depurador este tiempo, y resulta que llamar Application.Exit() es lanzar una System.InvalidOperationException con el siguiente mensaje:System.InvalidOperationException debido a la modificación de la colección en la llamada a Application.Exit()

Una primera excepción del tipo 'System.InvalidOperationException' en mscorlib. dll

Información adicional: Se modificó la colección; la operación de enumeración no se puede ejecutar.

no estoy seguro de lo que esta colección que ha sido modificado supuestamente es, o quién era el que lo modificó.

El seguimiento de la pila no es muy útil:

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

alguna idea de cómo puede averiguar qué ArrayList es que ha sido modificado? No creo que sea algo que estoy haciendo explícitamente, más probablemente sea una acción que estoy haciendo que modifique el estado subyacente del framework .NET durante el medio de una operación que MS no esperaba ...

+0

Parece la colección Forms. IIRC He visto esto suceder antes, pero no puedo recordar ningún detalle, lo siento. – leppie

+1

¿Qué hace su aplicación en el cierre? ¿Podría proporcionar el código? – Fischermaen

+0

Nada, realmente ... En el momento en que presioné el botón de salida, la aplicación estaba en estado inactivo, sin hilos de fondo ni actividades en ejecución. –

Respuesta

17

Unusual nunca he visto esto antes El método Application.ExitInternal() repite la colección Application.OpenForms. Claramente, esta colección se está modificando mientras lo hace. Hay pocas causas posibles para esto, solo puedo pensar en una. Uno de sus formularios ha anulado el método OnFormClosing() o ha suscrito el evento FormClosing. Y está haciendo algo que modifica la colección OpenForms. Podría estar eliminando el objeto de formulario o creando una nueva instancia de formulario o modificando una propiedad de formulario que hace que la ventana se vuelva a crear, como ShowInTaskbar.

No encontrará este código en la pila de llamadas. Revise su código On/FormClosing. Código de comentario si no puede encontrarlo rápidamente.

+0

Tengo un código FormClosing bastante enrevesado que a veces abre cuadros de mensajes. En cualquier caso, cambiar de Application.Exit() a this.Close() parece haber solucionado los problemas sin requerir que cambie los contenidos de FormClosing. –

+2

@ Hans Passant, teniendo exactamente el mismo problema; y efectivamente, mostré un cuadro de mensaje en mi método 'Form_CLOSING'. Y boom, la misma modificación de colección. Que tonto. Lo movió a 'Form_CLOSED' y bueno. Un poco extraño, pero bueno, felicitaciones por ese resultado. –

+1

Este era exactamente mi problema también, un MessageBox en OnClosing estaba invalidando el iterador de formularios abiertos de Application.Exit. Moverlo a OnClosed lo arregló! – Blindy

0

Acabamos de pasar días con este problema también ... donde obtuvimos la excepción 'System.InvalidOperationException' y la aplicación (en este caso usando una biblioteca twwain de DynamSoft). Aparentemente no deberíamos haber estado llamando a CLOSE() después de llamar a application.exit. Al comentar el cierre, la excepción desapareció y la aplicación finalizó normalmente. Visualmente, la aplicación mostraría un cuadro de mensaje extraño de Microsoft que decía "¿desea enviar más información sobre este problema?" - ¿QUÉ PROBLEMA? no mostró nada antes de esto, así que nos fuimos a buscar rastros de pila.

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