Използвам BackgroundWorker, тъй като трябва да дам обратна връзка в моя потребителски интерфейс. Също така трябва да използвам ThreadPool в моя клас, за да работи асинхронно, но изглежда, че моят фонов работник не може да улови изключението, което хвърля.
Той има за цел да даде обратна връзка за задачата, която изпълнява.
Направих просто приложение, което възпроизвежда проблема:
// MAIN UI CLASS
BackgroundWorker _bgWorker = new BackgroundWorker();
void _bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
// Returns custom error
MessageBox.Show(e.Error.Message);
}
}
void _bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
try {
// Initialize test error class
var testClass = new TestClass();
}
catch (Exception ex)
{
MessageBox.Show("im from trycatch");
}
}
private void Window_ContentRendered(object sender, EventArgs e)
{
_bgWorker.DoWork += _bgWorker_DoWork;
_bgWorker.RunWorkerCompleted += _bgWorker_RunWorkerCompleted;
}
/////////////////////////////////////////////////////////////////////////
// TEST ERROR CLASS
public TestClass()
{
throw new Exception("im a custom error");
}
Това работи добре. С try-catch той улавя грешката, както се обработва от try-catch. Докато, без try-catch, той го обработва в RunWorkerCompleted.
Наистина обаче трябва да правя тези методи асинхронно (поради което използвам ThreadPool), но дебъгерът винаги сочи към изключението. (само срива програмата, когато я пробвам без програмата за отстраняване на грешки)
// TEST ERROR CLASS
public TestClass()
{
ThreadPool.QueueUserWorkItem(delegate
{
throw new Exception("im a custom error");
}
}
Опитах се да върна грешката с помощта на оператор try-catch (надявайки се, че ще предаде изключението на BackgroundWorker), но не проработи.
Надявам се, че можете да ми помогнете. Благодаря предварително.