C#Delegate和Control中Invoke和BeginInvoke區別 最近總是遇到Control的Invoke和BeginInvoke問題,故作此總結。 **1、**Control的Invoke和BeginInvoke的委托方法是在主線程,即UI線程上執行的。也就是說如果你的委托方法比較耗 ...
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並沒有開闢新的線程完成委托任務,而是讓界面控制項的所屬線程完成委托任務的。看來非同步操作就是開闢新線程的說法不一定准確。