Когда я запускаю свою программу, иногда я получаю эти исключения, а иногда нет.Это поток выполнения:
Пользователь нажимает кнопку в классе Window1.
Класс собирает входные данные, запускается backgroundWorker.RunWorkerAsync ().
В DoWork App.doStuff () имеет значениес именем.
Внутри App.doStuff () я создаю другой поток, чтобы показать индикатор выполнения в другом окне, например:
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();
Теперь, если я запускаю его впервые, у меня никогда не будет проблем.Но когда / если я повторяю операцию после ее завершения, я могу получить исключения.
Глядя на код, я чувствую, что делаю что-то не так, вызывая dispatcher.Run () иThread.Start (), но я плохо понимаю модель потоков, поэтому я не уверен.
В любом случае, при первом запуске программа никогда не делает ничего необычного.Но иногда, когда я снова нажимаю кнопку, чтобы активировать процесс, возникает исключение.Я думаю, что это происходит, когда у программы не было достаточно времени для очистки?Хотя я не уверен.
РЕДАКТИРОВАТЬ
Кажется, что проблема в том, что поток ProgressWindow не заканчивается.Очевидно, что добавление Thread.Abort () внутри App.doStuff () или Dispatcher.Thread.Abort () внутри ProgressWindow решает проблему.Видимо.
Но все еще возникают исключения из-за метода Abort (), хотя он больше не падает.Я также не понимаю, почему закрытие ProgressWindow не завершает поток.И из того, что я прочитал с помощью Thread.Abort (), не очень хорошая практика, хотя опять же я не понимаю, почему.
EDIT 2
Thread.Abortвсе еще имел сбой время от времени.Итак, что я сделал:
Замените Show()
вызов на ShowDialog()
, как предложено, и
Удалите вызов для System.Windows.Threading.Dispatcher.Run();