天天看點

由 TypeInitializationException 引起的問題

Alonesword

<a href="http://blog.csdn.net/alonesword/">http://blog.csdn.net/alonesword/</a>

今天寫了程式更新的東東,其中用到了多線程。

背景線程負責聯系伺服器進行程式的更新,在更新過程中使用者可以随時中斷。

此程式在測試環境測試沒有問題,待釋出到正式環境後,問題來了。

當界面出現時,迅速的點選終止按鈕,更新過程的确是立即終止了。但是當點選其他的按鈕時,确實沒有了反應,檢視日志發現現在系統中有很多 TypeInitializationException 的錯誤。自己跟蹤發現一種極端情況下,更新程式出現了問題。

更新過程如下:

Updater -&gt; Other Thread -&gt; Worker -&gt; Connect Server -&gt; Download Lastest Package-&gt; Uncompress -&gt; Overwrite file -&gt; Finished

由于是啟動的背景線程,是以可以由使用者控制其更新過程,可随時中斷程式的執行。

在 connect server 的過程中,使用到了 Webservice。問題來了,

如果是在執行 webservice 的類型構造 static Webservice(){} 中,使用者中斷了程式的執行【通過 Thread.Abort() 終止】,則下次使用 webservice 的任何方法時,都會抛出 ThreadAbortException 的錯誤。即使在第一次發生 ThreadAbortException 的錯誤時,使用 thread.ResetAbort() 來重新釋放該對象,效果仍然是一樣。

通過分析上述問題,将界面的控件修改了一下,等待webservices 類型構造完成,這樣如果執行中斷時,至少保證 類型構造函數完成。

基于此次問題,重新回顧一下調用方法時的過程:

由 TypeInitializationException 引起的問題

繼續閱讀