天天看點

在C#中子線程如何操作主線程中窗體上控件

                                                       在C#中子線程如何操作主線程中窗體上控件

        在C#中,直接在子線程中對窗體上的控件操作是會出現異常,這是由于子線程和運作窗體的線程是不同的空間,是以想要在子線程來操作窗體上的控件,是不可能簡單的通過控件對象名來操作,但不是說不能進行操作,微軟提供了Invoke的方法,其作用就是讓子線程告訴窗體線程來完成相應的控件操作。

        要實作該功能,基本思路如下:

        把想對另一線程中的控件實施的操作放到一個函數中,然後使用delegate代理那個函數,并且在那個函數中加入一個判斷,用 InvokeRequired 來判斷調用這個函數的線程是否和控件線程處于同一線程中,如果是則直接執行對控件的操作,否則利用該控件的Invoke或BeginInvoke方法來執行這個代理。示例代碼如下:

這樣子就可以實作用子線程去操作主線程窗體上的控件的内容,同時,又不影響主線程對窗體上其他控件的響應。程式運作截圖如下:

在C#中子線程如何操作主線程中窗體上控件

點選[開始]按鈕,程式開啟一個新的線程,不斷向清單中添加新的資料,而同時不會影響主界面對其它控件(例如:文本框)的響應。

[P.S]:

INVOKE方法的作用:

它使該控件所在的線程執行Invoke方法參數中指定的代理,也就是使主線程執行我們想對控件進行的操作。