2012-01-21 10 views
12

Tengo un problema con el programa My WinApp Form que contiene una pestaña Control con DLL de control WebBrowser (GeckoFX).WinApp Form Crash sin ningún error o excepción .NET

Mi aplicación mientras se ejecuta cerca sin ninguna excepción ni nada. Podría ocurrir después de unos minutos o máximo después de 10 minutos. En Visual Studio veo que la aplicación termina con el código 0. Cualquier cosa.

En Program.cs capto todo esto no controlada excpetion

` // Add the event handler for handling UI thread exceptions to the event. 
       Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(UIThreadException); 

    // Set the unhandled exception mode to force all Windows Forms errors to go through 
    // our handler. 
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

// Add the event handler for handling non-UI thread exceptions to the event. 
       AppDomain.CurrentDomain.UnhandledException += 
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);` 

Ya proceso de registro del registrador de eventos de Windows para cualquier error, pero está limpio. Al igual que el programa termina bien. No sé si es culpa de Gecko DLL, pero no lo creo.

Utilizo httpWebRequest para descargar una lista que contiene alguna URL.

Luego uso un Backgroundworker que lee la lista de la URL, e invoco addTab Delegate Method Duerma un poco hasta que la página se cargue y continúe con otra AddTab Invoke.

Cuando la lista está vacía puedo comprobar si en la página de DOM hay una cierta cadena Luego, en Backgroundworker completa que cerrar todas las pestañas y disponer de ellos y hacer clic en el botón 1, que se inicia el Backgroundworker1.asyncall();

¿Hay algo malo con mi lógica? También publicaré el código, necesito que sea demasiado largo, pero realmente necesito entender dónde podría estar el error que finaliza mi aplicación. Si alguien puede ayudarme a ver por qué falla sin ningún error ni nada, lo agradeceré.

private void Start_Back_Click(object sender, EventArgs e) 
    {       
     List<Links> tempList = getListFromWeb(); 

     if (!backgroundWorker1.IsBusy) 
     { 
      backgroundWorker1.RunWorkerAsync(tempGoogle); 
     } 
    } 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      List<Links> temp = (List<Links>)e.Argument; 
      foreach (Links link in temp) 
      {     
       if (backgroundWorker1.CancellationPending) 
       { 
        e.Cancel = true; return;      
       } 
       _busy.WaitOne(); 

       if (tabs.InvokeRequired) 
       { 
         m_addTab addTabInvoke = addTabUrl; 
         Invoke(addTabInvoke, new Object[] { link.url, link.StringToSearch }); 
       } 
      } 
      Thread.Sleep(2000); 
      if (tabs.InvokeRequired) 
      { 
       foreach (Browser tempBrowser in ListCurrentBrowser) 
       { 
        if (backgroundWorker1.CancellationPending) 
        { 
         e.Cancel = true; 
         return; 
        } 
        _busy.WaitOne(); 
        Thread.Sleep(1000); 
        m_SeachTab addSearchInvoke = addTabPSearch; 
        Invoke(addSearchInvoke, tempBrowser); 
       } 
      } 
     } 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { //Check Stuff Error and Cancelled 
      if (e.Error != null) 
      {... } 
      else if (e.Cancelled) 
      { ....} 
      else //Else remove all tab 
      { 
       bool canRemove = this.TabCount >= 1; 
      if (canRemove) 
      { 
       WebBrowserTabPage tab = this.SelectedWebBrowserTagPage; 
       this.TabPages.Remove(tab); 
       tab.Dispose(); 
      } 
      **Start.Back.PerformClick();** //Click on button again to start another time the backgroundworker 
} 

}

+0

Es muy poco probable que tenga un error o una excepción.El código es bastante infeliz, no hay forma de que Start.Back.PerformClick() funcione. Y ninguno de los códigos BGW realmente se ejecuta en el hilo de trabajo. Agregue un controlador de eventos para el evento FormClosing del formulario y establezca un punto de interrupción en él. –

+0

¿Qué sugieres para crear un código mejor? ¿Podría decirme cómo puedo gestionarlo? Creo el BackGroundworker y luego? ¿Cómo puedo reiniciar backgroundworker una vez que termine? Agradecería si me puede decir cómo podría escribir un mejor código :) – user1107078

+1

posible duplicado de [Fallos de la aplicación con "Error interno en .NET Runtime"] (http://stackoverflow.com/questions/4367664/application- crashes-with-internal-error-in-the-net-runtime) –

Respuesta

0

En realidad, cuando excepción no controlada se produce en otro hilo todo el proceso se termina. Necesita ejecutar su aplicación en depuración con ambas casillas de verificación para Depurar/Excepciones/Excepciones de tiempo de ejecución del lenguaje común establecer.

+0

ya lo hice, verifico todo tipo de cuadro para la excepción posible y todavía nada. – user1107078

0

Intenta poner un bloque try/catch alrededor de tu código en backgroundWorker1_DoWork y pon un punto de interrupción en la cláusula catch, deberías poder capturar la excepción.

+0

es lo primero que hice pero .net runtime crash no arroja ninguna excepción. – user1107078

2

Desde el sitio de Microsoft: Comenzando con .NET Framework versión 4, este evento no se plantea para excepciones que corrompen el estado del proceso, como desbordamientos de pila o violaciones de acceso, a menos que el controlador de eventos sea crítico para la seguridad y tiene el atributo HandleProcessCorruptedStateExceptionsAttribute. Quizás debería intentar agregar ese atributo.

Para Application.ThreadException, desde el sitio de Microsoft de nuevo: "para garantizar que no hay activaciones de este evento se pierden, debe adjuntar un controlador antes de llamar Application.Run." En su código no es claro si adjuntas el controlador antes de llamar a Application.Run.

También - es posible que desee tener el bloque catch try "genérico" en lugares que pueden estar llamando código no administrado:

try { 
// Code goes here 
} 
catch { //Unmanaged exceptions will be caught here as well. 

} 

try { 
// Code goes here. 
} 
catch(Exception ex){ // only managed exceptions are caught, avoid that in your case. 
} 

El primero será capturar excepciones no administrados, mientras que el segundo no.

Cuestiones relacionadas