Alonesword
<a href="http://blog.csdn.net/alonesword/">http://blog.csdn.net/alonesword/</a>
今天寫了程式更新的東東,其中用到了多線程。
背景線程負責聯系伺服器進行程式的更新,在更新過程中使用者可以随時中斷。
此程式在測試環境測試沒有問題,待釋出到正式環境後,問題來了。
當界面出現時,迅速的點選終止按鈕,更新過程的确是立即終止了。但是當點選其他的按鈕時,确實沒有了反應,檢視日志發現現在系統中有很多 TypeInitializationException 的錯誤。自己跟蹤發現一種極端情況下,更新程式出現了問題。
更新過程如下:
Updater -> Other Thread -> Worker -> Connect Server -> Download Lastest Package-> Uncompress -> Overwrite file -> Finished
由于是啟動的背景線程,是以可以由使用者控制其更新過程,可随時中斷程式的執行。
在 connect server 的過程中,使用到了 Webservice。問題來了,
如果是在執行 webservice 的類型構造 static Webservice(){} 中,使用者中斷了程式的執行【通過 Thread.Abort() 終止】,則下次使用 webservice 的任何方法時,都會抛出 ThreadAbortException 的錯誤。即使在第一次發生 ThreadAbortException 的錯誤時,使用 thread.ResetAbort() 來重新釋放該對象,效果仍然是一樣。
通過分析上述問題,将界面的控件修改了一下,等待webservices 類型構造完成,這樣如果執行中斷時,至少保證 類型構造函數完成。
基于此次問題,重新回顧一下調用方法時的過程:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SU2lne5ATN5QjN4cjMx8FMvwVOvw1NwATMwIzLcRnbl1GajFGd0F2LcRXZu5ibkN3YukGavw1LcpDc0RHaiojIsJye.gif)