C#Delegate和Control中Invoke和BeginInvoke區別
最近總是遇到Control的Invoke和BeginInvoke問題,故作此總結,
1、Control的Invoke和BeginInvoke的委托方法是在主執行緒,即UI執行緒上執行的,也就是說如果你的委托方法比較耗時的操作,然后更新界面什么的,千萬別在UI執行緒上呼叫Control.Invoke和Control.BeginInvoke,因為這些是依然阻塞UI執行緒的,造成界面的假死,
2、在Control中,異步是指相對于呼叫BeginInvoke的執行緒異步,而不是相對于UI執行緒異步,你在UI執行緒上呼叫BeginInvoke ,沒有什么作用,如果我們開一個執行緒,讓執行緒執行一些耗費時間的操作,然后再用Control.Invoke和Control.BeginInvoke回到用戶UI執行緒,執行界面更新,
3、Delegate.BeginInvoke方法是從Thread Pool中取出一個執行緒來執行這個方法,從而獲得異步效果的,通過一個委托來進行同步方法的異步呼叫,也是.net提供的異步呼叫機制之一,但是Delegate.BeginInvoke方法是從ThreadPool取出一個執行緒來執行這個方法,以獲得異步執行效果的,也就是說,如果采用這種方式提交多個異步委托,那么這些呼叫的順序無法得到保證,而且由于是使用執行緒池里面的執行緒來完成任務,使用頻繁,會對系統的性能造成影響,
Delegate.BeginInvoke也是講一個委托方法封送到其它執行緒,從而通過異步機制執行一個方法,呼叫者執行緒則可以在完成封送以后去繼續它的作業,但是這個方法封送到的最終執行執行緒是運行庫從ThreadPool里面選取的一個執行緒,
這里需要糾正一個誤區,那就是Control類上的異步呼叫BeginInvoke并沒有開辟新的執行緒完成委托任務,而是讓界面控制元件的所屬執行緒完成委托任務的,看來異步操作就是開辟新執行緒的說法不一定準確,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/469766.html
標籤:.NET技术