Сбой формы WinApp без каких-либо ошибок или исключений .Net - PullRequest
12 голосов
/ 21 января 2012

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

Мое приложение во время работы без каких-либо исключений. Это может произойти через несколько минут или максимум через 10 минут. В Visual Studio я вижу, как приложение завершается с кодом 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.

Когда список пуст, я проверяю, есть ли на странице DOM определенная строка. Затем в Backgroundworker Complete я закрываю все вкладки и утилизирую их, и я нажимаю кнопку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
}
* *} Тысяча двадцать-один

Ответы [ 3 ]

2 голосов
/ 31 января 2012

С сайта 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.
}

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

0 голосов
/ 31 января 2012

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

0 голосов
/ 24 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...