當運行我的程序時,有時我會得到這些異常,其他時候我不會。這是執行流程: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