Arresto modulo WinApp senza errori o eccezioni .Net

Ho un problema con il mio programma Modulo WinApp che contiene una scheda Controllo con DLL controllo WebBrowser (GeckoFX).

La mia applicazione mentre correva senza eccezioni o altro. Potrebbe succedere dopo pochi minuti o dopo max 10 minuti. Nello studio visivo vedo l’applicazione terminare con il codice 0. Qualsiasi cosa.

In program.cs prendo tutta questa escrezione non gestita

` // 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);` 

Ho già controllato il logger degli eventi di Windows per qualsiasi errore, ma è pulito. Proprio come il Programma è terminato bene. Non so se è colpa di Gecko DLL ma non la penso così.

Io uso httpWebRequest per scaricare un elenco che contiene alcuni URL.

Quindi utilizzo un Backgroundworker che legge l’elenco dell’URL e invoca AddTab Delegate Method Sospendi un po ‘fino a quando la pagina non viene caricata e continua con altri richiami di AddTab.

Quando la lista è vuota, controllo se nella pagina DOM c’è una certa stringa Poi in Backgroundworker Completa I Chiudi tutte le tabs e Disponi loro e faccio clic sul pulsante 1 che avvia Backgroundworker1.asyncall();

C’è qualcosa di sbagliato nella mia logica? Pubblicherò anche il codice, ho bisogno che sia troppo lungo ma ho davvero bisogno di capire dove potrebbe essere l’errore che termina la mia domanda. Se qualcuno può aiutarmi a capire perché si blocca senza alcun errore o altro, lo apprezzerò.

 private void Start_Back_Click(object sender, EventArgs e) { List tempList = getListFromWeb(); if (!backgroundWorker1.IsBusy) { backgroundWorker1.RunWorkerAsync(tempGoogle); } } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { List temp = (List)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 } 

}

Da sito Microsoft: a partire da .NET Framework versione 4, questo evento non viene generato per eccezioni che corrompono lo stato del processo, quali overflow dello stack o violazioni dell’accesso, a meno che il gestore eventi non sia critico per la sicurezza e abbia l’attributo HandleProcessCorruptedStateExceptionsAttribute. Forse dovresti provare ad aggiungere quell’attributo.

Per Application.ThreadException, di nuovo dal sito Microsoft: ” Per garantire che nessuna triggerszione di questo evento venga persa, è necessario albind un gestore prima di chiamare Application.Run. ” Nel codice non è chiaro se si allega il gestore prima di chiamare Application.Run.

Inoltre, potresti voler impostare il blocco catch generico nei punti che potrebbero chiamare il codice non gestito:

 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. } 

Il primo catturerà le eccezioni non gestite mentre il secondo non lo farà.

In realtà quando si verifica un’eccezione non gestita in un altro thread, l’intero processo viene terminato. È necessario eseguire l’applicazione in debug con entrambe le caselle di controllo per Debug / Exceptions / Common Language Runtime Exceptions set.

Prova a inserire un blocco try / catch attorno al tuo codice in backgroundWorker1_DoWork e inserisci un punto di interruzione nella clausola catch, dovresti essere in grado di rilevare l’eccezione.