当运行我的程序时,有时我会得到这些异常,其他时候我不会。这是执行流程:System.InvalidOperationException和System.Reflection.TargetInvocationException偶尔发生
用户单击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线程不会结束。显然,在ProgressWindow内部的App.doStuff()或Dispatcher.Thread.Abort()中添加一个Thread.Abort()可以修复问题。显然。
但是,由于Abort()方法,它仍然引发异常,尽管它不再崩溃。我也不明白为什么关闭ProgressWindow不会结束线程。从我读过的使用Thread.Abort()不是很好的做法,虽然我不明白为什么。
EDIT 2
Thread.Abort的仍然保留着它有时崩溃。所以,我所做的就是:
更换Show()
呼吁ShowDialog()
,作为建议和
取出呼吁System.Windows.Threading.Dispatcher.Run();
ProgressWindow仅具有对mainWindow.backgroundWorker的引用。 ProgressWindow中的关闭事件调用backgroundWorker.CancelAsync() - 如果关闭ProgressWindow,则取消该任务。我评论说,这些线路阻止它做任何事情,并没有这样做。 – zxcvbnm 2010-02-19 19:24:31