在C#中子線程如何操作主線程中窗體上控件
在C#中,直接在子線程中對窗體上的控件操作是會出現異常,這是由于子線程和運作窗體的線程是不同的空間,是以想要在子線程來操作窗體上的控件,是不可能簡單的通過控件對象名來操作,但不是說不能進行操作,微軟提供了Invoke的方法,其作用就是讓子線程告訴窗體線程來完成相應的控件操作。
要實作該功能,基本思路如下:
把想對另一線程中的控件實施的操作放到一個函數中,然後使用delegate代理那個函數,并且在那個函數中加入一個判斷,用 InvokeRequired 來判斷調用這個函數的線程是否和控件線程處于同一線程中,如果是則直接執行對控件的操作,否則利用該控件的Invoke或BeginInvoke方法來執行這個代理。示例代碼如下:
這樣子就可以實作用子線程去操作主線程窗體上的控件的内容,同時,又不影響主線程對窗體上其他控件的響應。程式運作截圖如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TPnF2bsdVWxgmMjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN4UDMzUTN3EDMyETM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
點選[開始]按鈕,程式開啟一個新的線程,不斷向清單中添加新的資料,而同時不會影響主界面對其它控件(例如:文本框)的響應。
[P.S]:
INVOKE方法的作用:
它使該控件所在的線程執行Invoke方法參數中指定的代理,也就是使主線程執行我們想對控件進行的操作。