Подтвердить что ты не робот

Сбой формы WinApp без каких-либо ошибок или исключений .Net

У меня проблема с программой My WinApp Form, которая содержит вкладку Control с управляющей DLL-библиотекой WebBrowser (GeckoFX).

Мое приложение работает без каких-либо исключений или чего-либо еще. Это может произойти через несколько минут или максимум через 10 мин. В визуальной студии я вижу, что приложение заканчивается кодом 0. Все.

В program.cs я поймаю все это необработанное упражнение

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

Я уже проверяю регистратор событий Windows на наличие ошибок, но он очищается. Так же, как программа прекращается хорошо. Я не знаю, была ли ошибка Gecko DLL, но я так не думаю.

Я использую httpWebRequest для загрузки списка, который содержит некоторый URL.

Затем я использую Backgroundworker, который считывает список URL-адреса, и вызывает метод делегирования addTab до тех пор, пока страница не будет загружена и не продолжит работу с другим AddTab Invoke.

Когда список пуст, я проверяю, есть ли на странице DOM определенная строка. Затем в Backgroundworker Завершить, я закрываю все вкладки и удаляю их, и я нажимаю кнопку 1, которые запускают Backgroundworker1.asyncall();

Что-то не так с моей логикой? Я тоже отправлю код, мне нужно, чтобы он слишком долго, но мне действительно нужно понять, где может быть ошибка, которая прерывает мое приложение. Если кто-то может помочь мне понять, почему он терпит крах без какой-либо ошибки или чего-то, что мне это понравится.

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
}

}

4b9b3361

Ответ 1

С сайта Microsoft: начиная с .NET Framework версии 4 это событие не возникает для исключений, которые приводят к повреждению состояния процесса, такого как переполнение стека или нарушения доступа, если обработчик событий не критичен с точки зрения безопасности и имеет Атрибут HandleProcessCorruptedStateExceptionsAttribute. Возможно, вам стоит попробовать добавить этот атрибут.

Для Application.ThreadException с сайта Microsoft снова: "Чтобы гарантировать, что никакие активации этого события не будут пропущены, вы должны приложить обработчик, прежде чем вызвать Application.Run". В вашем коде неясно, присоединяете ли вы обработчик перед вызовом Application.Run.

Кроме того, вы можете захотеть, чтобы "общий" try catch блокировал места, которые могут вызывать неуправляемый код:

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

В первую очередь поймают неуправляемые исключения, а вторая не будет.

Ответ 2

Фактически, когда необработанное исключение возникает в другом потоке, весь процесс заканчивается. Вам нужно запустить приложение под отладкой, у которого установлены оба флажка для исключений отладки/исключений/общих языковых исключений.

Ответ 3

Попробуйте помещать блок try/catch вокруг вашего кода в backgroundWorker1_DoWork и помещать точку останова в предложение catch, вы должны уловить исключение.