При запуске моей программы иногда я получаю эти исключения, иногда я этого не делаю. Это поток исполнения:System.InvalidOperationException и System.Reflection.TargetInvocationException иногда случается
Пользователь нажимает кнопку в классе Window1.
Класс собирает входы, backgroundWorker.RunWorkerAsync() запускается.
В DoWork вызывается App.doStuff().
Внутри App.doStuff(), я создаю еще одну нить, чтобы показать ProgressBar в отдельном окне, как это:
Thread newWindowThread = new Thread(new ThreadStart(showProgressMethod));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
В showProgressMethod(), я делаю:
progressWindow = new MyProgressWindow(this);
progressWindow.Show();
System.Windows.Threading.Dispatcher.Run();
Теперь, если Я запускаю его в первый раз, у меня нет никаких проблем. Но когда/если я повторю операцию после ее завершения, я могу получить исключения.
Посмотрев на код, у меня возникает ощущение, что я делаю что-то неправильно, вызывая диспетчер. Run() и Thread.Start(), но я не очень хорошо разбираюсь в модели потоков, поэтому я не уверен.
В любом случае, при первом запуске программа никогда не делает ничего необычного. Но иногда, когда я снова нажимаю кнопку, чтобы активировать процесс, возникает исключение. Я думаю, что это происходит, когда программе не хватает времени на очистку? Хотя я не уверен.
EDIT
Кажется, что проблема заключается в том, что ProgressWindow нить не заканчивается. Очевидно, что добавление Thread.Abort() внутри App.doStuff() или Dispatcher.Thread.Abort() внутри ProgressWindow устраняет проблему. По всей видимости.
Но он по-прежнему вызывает исключения из-за метода Abort(), хотя он больше не сработает. Я также не понимаю, почему закрытие ProgressWindow не завершает поток. И из того, что я прочитал с помощью Thread.Abort(), не очень хорошая практика, хотя я снова не понимаю почему.
EDIT 2
Thread.Abort еще это сбой в разы. Итак, что я сделал это:
Заменить Show()
призыв ShowDialog()
, как это было предложено и
Удалить вызов для System.Windows.Threading.Dispatcher.Run();
ProgressWindow имеет ссылку на mainWindow.backgroundWorker. Событие закрытия в ProgressWindow вызывает backgroundWorker.CancelAsync() - если я закрываю ProgressWindow, я отменяю задачу. Я прокомментировал эти строки, чтобы они не делали ничего, и это не делалось. – zxcvbnm