掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
VS建模是主線(xiàn)程消息隊(duì)列相關(guān)的,發(fā)送給主窗體的消息才能發(fā)送到界面主線(xiàn)程消息隊(duì)列。我們可以看到VS建模方法使用了同樣的實(shí)現(xiàn),只是VS建模方法的***一個(gè)參數(shù)值不一樣。

十余年建站經(jīng)驗(yàn), 成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)客戶(hù)的見(jiàn)證與正確選擇。成都創(chuàng)新互聯(lián)公司提供完善的營(yíng)銷(xiāo)型網(wǎng)頁(yè)建站明細(xì)報(bào)價(jià)表。后期開(kāi)發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。
如果你的后臺(tái)線(xiàn)程需要操作UI控件,并且需要等到該操作執(zhí)行完畢才能繼續(xù)執(zhí)行,那么你就應(yīng)該使用Invoke。否則,VS建模在后臺(tái)線(xiàn)程和主截面線(xiàn)程共享某些狀態(tài)數(shù)據(jù)的情況下,如果不同步調(diào)用,而是各自繼續(xù)執(zhí)行的話(huà),可能會(huì)造成執(zhí)行序列上的問(wèn)題,雖然不發(fā)生死鎖,但是會(huì)出現(xiàn)不可預(yù)料的顯示結(jié)果或者數(shù)據(jù)處理錯(cuò)誤。
VS建模可以看到ISynchronizeInvoke有一個(gè)屬性,InvokeRequired。VS建模這個(gè)屬性就是用來(lái)在編程的時(shí)候確定,一個(gè)對(duì)象訪(fǎng)問(wèn)UI控件的時(shí)候是否需要使用Invoke或者BeginInvoke來(lái)進(jìn)行封送。如果不需要那么就可以直接更新。在調(diào)用者對(duì)象和UI對(duì)象同屬一個(gè)線(xiàn)程的時(shí)候這個(gè)屬性返回false。在后面的代碼分析中我們可以看到,Control類(lèi)對(duì)這一屬性的實(shí)現(xiàn)就是在判斷調(diào)用者和控件是否屬于同一個(gè)線(xiàn)程的。
Delegate.BeginInvoke
通過(guò)一個(gè)委托來(lái)進(jìn)行同步方法的異步調(diào)用,也是.net提供的異步調(diào)用機(jī)制之一。但是Delegate.BeginInvoke方法是從ThreadPool取出一個(gè)線(xiàn)程來(lái)執(zhí)行這個(gè)方法,以獲得異步執(zhí)行效果的。也就是說(shuō),如果采用這種方式提交多個(gè)異步委托,那么這些調(diào)用的順序無(wú)法得到保證。而且由于是使用線(xiàn)程池里面的線(xiàn)程來(lái)完成任務(wù),使用頻繁,會(huì)對(duì)系統(tǒng)的性能造成影響。
Delegate.BeginInvoke也是講一個(gè)委托方法封送到其它線(xiàn)程,從而通過(guò)異步機(jī)制執(zhí)行一個(gè)方法。調(diào)用者線(xiàn)程則可以在完成封送以后去繼續(xù)它的工作。VS建模但是這個(gè)方法封送到的最終執(zhí)行線(xiàn)程是運(yùn)行庫(kù)從ThreadPool里面選取的一個(gè)線(xiàn)程。#t#
這里需要糾正一個(gè)誤區(qū),VS建模那就是Control類(lèi)上的異步調(diào)用BeginInvoke并沒(méi)有開(kāi)辟新的線(xiàn)程完成委托任務(wù),而是讓界面控件的所屬線(xiàn)程完成委托任務(wù)的。看來(lái)異步操作就是開(kāi)辟新線(xiàn)程的說(shuō)法不一定準(zhǔn)確。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流