天天看點

異步與線程深度解析

注:一般人們都把異步與同步做比較,今天我們把異步與線程做比較。請大家多多指教、批評。

最近用C#(

Framework 2.0

)寫了一個系統,這個系統用了很多異步和線程。當我用異常或線程操作、更新控件資訊的時候會提示一個異常資訊“線程間操作無效,從不是建立控件的線程通路控件”,以前用也遇到過這種問題,最後是用Invoke解決的。但是這次遇到同樣的問題,解決方法用到了

Control.CheckForIllegalCrossThreadCalls

這個屬性,把它設定為false;檢視MSDN的備注資訊,解釋如下:

通路 Windows 窗體控件本質上不是線程安全的。如果有兩個或多個線程操作某一控件的狀态,則可能會迫使該控件進入一種不一緻的狀态。還可能出現其他與線程相關的 bug,包括争用情況和死鎖。確定以線程安全方式通路控件非常重要。

.NET Framework 有助于在以非線程安全方式通路控件時檢測到這一問題。在調試器中運作應用程式時,如果建立某控件的線程之外的其他線程試圖調用該控件,則調試器會引發一個

InvalidOperationException

,并提示消息:“從不是建立控件 control name 的線程通路它。”

此異常在調試期間和運作時的某些情況下可靠地發生。強烈建議您在顯示此錯誤資訊時修複此問題。在調試以 .NET Framework 2.0 版之前的 .NET Framework 編寫的應用程式時,可能會出現此異常。

注意

可以通過将

CheckForIllegalCrossThreadCalls

屬性的值設定為 false 來禁用此異常。這會使控件以與在 Visual Studio 2003 下相同的方式運作。

從以上的解釋來看,其實異步是基于委托操作方法,以線程機制來完成的。當然從面表面上我們可以這樣了解,但是兩者具體實作機制是怎麼樣的,我們還需要深入探讨。就是程式設計經驗來說,兩者在使用上還是有相同點和不同點的:

相同點:

1)他們都可以做任務來執行,不會使軟體界出現假死現象。

2)在異常和線程裡操作控件,如果不特殊處理的話,都會出現“線程間操作無效,

     從不是建立控件的線程通路  控件”異常

不同點:

1)異步是一個某一時間點的任務;線程可以可以作為實時任務。

2)如果把異步看到線程的話,可以線上程開始時向線程内部傳入參數;而線程的變

     量參數來自對象的全局變量。

3)異步的結束采用回調函數來釋放資源,不需要人為幹涉;而線程做為實時任務,

     在資源控制方面更多需要我為控制。

4)異步更容易控制;線程在控制的時候更需要細節方面的知識。

總結的有可能不太準确,但是供大家參考。希望大家留言交流。關于異步和線程的具體應用,還需要大家在具體的工作中體會。

源自:【

百木破解

】異步與線程深度解析

http://www.bmpj.net/forum-viewthread-tid-229-fromuid-28.html http://blog.csdn.net/lsjwq/archive/2009/07/01/4312931.aspx