什么是進程呢?當一個程序開始運行時,它就是一個進程,進程所指包括運行中的程序和程序所使用到的內存和系統資源。而一個進程又是由多個線程所組成的,線程是程序中的一個執行流,每個線程都有自己的專有寄存器(棧指針、程序計數器等),但代碼區是共享的,即不同的線程可以執行同樣的函數。
在多線程編程中,我們經常要在工作線程中去更新界面顯示,而在多線程中直接調用界面控件的方法是錯誤的做法,Invoke 和 BeginInvoke 就是為了解決這個問題而出現的,使你在多線程中安全的更新界面顯示。
正確的做法是將工作線程中涉及更新界面的代碼封裝為一個方法,通過 Invoke 或者 BeginInvoke 去調用,兩者的區別就是一個導致工作線程等待,而另外一個則不會。(參考文章底部)
Invoke()的作用是:在應用程序的主線程上執行指定的委托。一般應用:在輔助線程中修改UI線程( 主線程 )中對象的屬性時,調用this.Invoke();
例:
/* 相機打開回調 */
private void OnCameraOpen(object sender, EventArgs e)
{
this.Invoke(new Action(() =>
{
btnOpen.Enabled = false;
btnClose.Enabled = true;
}));
}
Control.Invoke 方法 (Delegate) :在擁有此控件的基礎窗口句柄的線程上執行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在創建控件的基礎句柄所在線程上異步執行指定委托。
Control的Invoke和BeginInvoke的參數為delegate,委托的方法是在Control的線程上執行的,也就是我們平時所說的UI線程。