C #: Почему сигнализация моего фонового рабочего потока выполняется, когда это не так? - PullRequest
5 голосов
/ 21 декабря 2010

C #, используя VS2010, и у меня есть то, что не имеет смысла.

При запуске моей программе нужно загрузить несколько сотен килограмм из текстовых файлов. Убедившись, что код загрузки работает нормально, я добавил его в фоновый поток. Пока это выполняется изнутри IDE, все в порядке, но когда он запускается автономно, поток говорит, что он выполнен, когда это не так. Это, конечно, бум.

Код триггера:

BackgroundWorker Background = new BackgroundWorker();
Background.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DatabaseLoaded);
Background.DoWork += new DoWorkEventHandler(delegate { Database.Load(); });
Background.RunWorkerAsync();

и бум, который сейчас идет, находится в DatabaseLoaded().

Я поместил несколько ящиков сообщений для отслеживания происходящего: первая и последняя строки метода Load() и первая строка DatabaseLoaded().

В IDE это срабатывает, как я и ожидал: Load() начало, Load() готово, DatabaseLoaded(). Однако при автономном запуске я получаю Load() начало, DatabaseLoaded(), а затем необработанное поле исключений (загрузчик даже не смог создать пустые таблицы, не говоря уже о их заполнении).

Я чокнутый или Microsoft?

Ответы [ 2 ]

17 голосов
/ 21 декабря 2010

RunWorkerCompleted будет вызвано в случае ошибки (например, необработанное исключение в Database.Load()).Проверьте Error свойство RunWorkerCompletedEventArgs.

4 голосов
/ 21 декабря 2010

Вероятно, исключение выдается из Database.Load(). BackgroundWorker перехватывает любое необработанное исключение перед тем, как вызвать событие RunWorkerCompleted. Проверьте RunWorkerCompletedEventArgs.Error свойство в DatabaseLoaded.

...