如果在winform構建的GUI界面,通過事件響應函數改變控件的狀態(比如某個按鈕文本爲“Open”,單擊之後需要顯示“Close”),需要在控件響應函數中調用控件的Invoke方法。
因爲存在一種可能: 如果控件是在主線程創建,進入控件的事件響應函數是在控件所在的線程,而不是主線程。則當在事件響應函數中改變控件的狀態,可能與主線程發生線程衝突。
C#中是禁止跨線程直接訪問控件的,可以使用控件的InvokeRequired
屬性檢查,如果爲true,則需要通過Invoke
方法對控件進行調用。
如果從線程外操作windows窗體控件,那麼就需要使用Invoke
或者BeginInvoke
方法,通過一個委託把調用封送到控件所屬的線程上執行。
public void DisplayTime(double time)
{
InvokeIfRequired(() => // Lambda 表達式
{
timePanel.Text = "Time : " + time.ToString("F3");
timePanel.Visible = true;
});
}
private void InvokeIfRequired(MethodInvoker _delegate)
{
if (statusStrip1.InvokeRequired)
statusStrip1.BeginInvoke(_delegate);
else
_delegate();
}