Я написал класс FileProcessor, который обертывает FileSystemWatcher (fsw), а также имеет поток BackgroundWorker (bgw) для обработки элементов в очереди;
Класс FileProcessor используется из приложения WPF; таким образом, пользовательский интерфейс WPF запускает как потоки fsw, так и потоки bgw;
Мне не нужно сообщать потоку пользовательского интерфейса WPF, что произошли ошибки, мне нужно, чтобы ошибки в потоках fsw и bgw не приводили к сбою (сбоям) пользовательского интерфейса WPF, что является моей текущей проблемой. .
Я обработал ошибки, о которых я знаю, и это остановило сбой, но что мне действительно нужно, так это глобальные универсальные обработчики ошибок для объектов fsw и bgw, которые (молча) игнорируют любые неожиданные ошибки. Есть ли такая вещь?
public class FileProcessor
{
private FileSystemWatcher _fsw;
private BackgroundWorker _bgw;
//constructor
public FileProcessor()
{
//initialize
_bgThread = new BackgroundWorker();
_fsw = new FileSystemWatcher();
_fsw.Created += new FileSystemEventHandler(fsw_OnCreated);
_fsw.Error += new ErrorEventHandler(fsw_OnError);
//... etc.
}
public void StartAsync()
{
_fsw.EnableRaisingEvents = true; //start fsw on its own thread
_bgThread.RunWorkerAsync(); //start bgw on its own thread
//... etc
}
private void fsw_OnCreated(object sender, FileSystemEventArgs e)
{
//local error handler;
try
{
DoStuff();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void fsw_OnError(object sender, ErrorEventArgs e)
{
//THIS EVENT NEVER FIRED OnError from DoStuff() when i didn't have try/catch around DoStuff() !
//so it seems it's not meant to handle all Global errors from fsw.
MessageBox.Show(e.GetException().Message);
}
//What i want are Global Error Handlers so that _fsw does not bring down the UI!;
//Ditto for _bgw
} //end FileProcessor class
... и некоторый метод в пользовательском интерфейсе WPF, который использует вышеуказанный класс FileProcessor.
FileProcessor _processor = new FileProcessor() //form level.
private void btnButtonStart_Click(object sender, RoutedEventArgs e)
{
_processor.StartAsync();
}
РЕДАКТИРОВАТЬ: если это уместно, в настоящее время класс FileProcessor и пользовательский интерфейс WPF находятся в одном проекте (типа приложения Windows), но я намерен переместить FileProcessor в свой собственный проект библиотеки классов.