Сбой формы 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
}
}
Ответы
Ответ 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, вы должны уловить исключение.