【C#】Invoke 和 InvokeRequired,線程安全

如果在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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章