您好,登錄后才能下訂單哦!
這篇文章主要介紹了C#的異步與線程概念是什么的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C#的異步與線程概念是什么文章都會(huì)有所收獲,下面我們一起來看看吧。
最近用C#(Framework 2.0)寫了一個(gè)系統(tǒng),這個(gè)系統(tǒng)用了很多異步和線程。當(dāng)我用異?;蚓€程操作、更新控件信息的時(shí)候會(huì)提示一個(gè)異常信息“線程間操作無效,從不是創(chuàng)建控件的線程訪問控件”,以前用也遇到過這種問題,最后是用Invoke解決的。但是這次遇到同樣的問題,解決方法用到了Control.CheckForIllegalCrossThreadCalls這個(gè)屬性,把它設(shè)置為false;查看MSDN的備注信息,解釋如下:
訪問 Windows 窗體控件本質(zhì)上不是線程安全的。如果有兩個(gè)或多個(gè)線程操作某一控件的狀態(tài),則可能會(huì)迫使該控件進(jìn)入一種不一致的狀態(tài)。還可能出現(xiàn)其他與線程相關(guān)的 bug,包括爭(zhēng)用情況和死鎖。確保以線程安全方式訪問控件非常重要。
.NET Framework 有助于在以非線程安全方式訪問控件時(shí)檢測(cè)到這一問題。在調(diào)試器中運(yùn)行應(yīng)用程序時(shí),如果創(chuàng)建某控件的線程之外的其他線程試圖調(diào)用該控件,則調(diào)試器會(huì)引發(fā)一個(gè) InvalidOperationException,并提示消息:“從不是創(chuàng)建控件 control name 的線程訪問它?!?
此異常在調(diào)試期間和運(yùn)行時(shí)的某些情況下可靠地發(fā)生。強(qiáng)烈建議您在顯示此錯(cuò)誤信息時(shí)修復(fù)此問題。在調(diào)試以 .NET Framework 2.0 版之前的 .NET Framework 編寫的應(yīng)用程序時(shí),可能會(huì)出現(xiàn)此異常。
注意 |
---|
可以通過將 CheckForIllegalCrossThreadCalls 屬性的值設(shè)置為 false 來禁用此異常。這會(huì)使控件以與在 Visual Studio 2003 下相同的方式運(yùn)行。
從以上的解釋來看,其實(shí)異步是基于委托操作方法,以線程機(jī)制來完成的。當(dāng)然從面表面上我們可以這樣理解,但是兩者具體實(shí)現(xiàn)機(jī)制是怎么樣的,我們還需要深入探討。就是編程經(jīng)驗(yàn)來說,兩者在使用上還是有相同點(diǎn)和不同點(diǎn)的:
相同點(diǎn): 1)他們都可以做任務(wù)來執(zhí)行,不會(huì)使軟件界出現(xiàn)假死現(xiàn)象。 2)在異常和線程里操作控件,如果不特殊處理的話,都會(huì)出現(xiàn)“線程間操作無效, 從不是創(chuàng)建控件的線程訪問 控件”異常
不同點(diǎn): 1)異步是一個(gè)某一時(shí)間點(diǎn)的任務(wù);線程可以可以作為實(shí)時(shí)任務(wù)。 2)如果把異步看到線程的話,可以在線程開始時(shí)向線程內(nèi)部傳入?yún)?shù);而線程的變 量參數(shù)來自對(duì)象的全局變量。 3)異步的結(jié)束采用回調(diào)函數(shù)來釋放資源,不需要人為干涉;而線程做為實(shí)時(shí)任務(wù), 在資源控制方面更多需要我為控制。 4)異步更容易控制;線程在控制的時(shí)候更需要細(xì)節(jié)方面的知識(shí)。 |
關(guān)于“C#的異步與線程概念是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“C#的異步與線程概念是什么”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。