2.其他線程的代碼不能直接操作UI線程中的控件。需要委托人。
妳的具體需求我不是很清楚。但是我在這裏假設壹個例子:
比如我有壹個買票的程序,每隔2秒就要去服務器請求剩余的票數。顯示在界面上。
界面上還有“售票”、“退票”等操作。界面如下:
那麽代碼可以寫成這樣:
使用?系統;
使用?系統。集合。泛型;
使用?系統。組件模型;
使用?系統。數據;
使用?系統。繪圖;
使用?系統。文本;
使用?系統。Windows . Forms
使用?系統。穿線;
命名空間?windows forms應用程序1
{
公共?部分?班級?Form1?:?形式
{
//BackgroundWorker是壹個封裝良好的線程類。它帶有。網。
私人?背景工人?bg?=?新的?background worker();
//委托來更改界面顯示。
私人?委派?作廢?delegateSetCounter(int?計數);
公共?表單1()
{
initialize component();
//將BackgroundWorker設置為do。
bg。道克?+=?新的?DoWorkEventHandler(BG _ DoWork);
//設置BackgroundWorker支持線程中斷。
bg。workers supports取消?=?真實;
}
//線程將要做的主要部分
私人?作廢?bg_DoWork(對象?發件人?DoWorkEventArgs?e)
{
//這裏假設線程無限循環。
什麽時候?(正確)
{
//如果線程被取消,則退出。
如果?(bg。取消待定)
返回;
//這裏用隨機數獲取數據,模擬從數據庫中取數據。
隨機?r?=?新的?隨機(日期時間。現在.秒);
int?數數?=?r.Next(1,?100);
//委托,與DoSetCounter函數關聯
delegateSetCounter?sc?=?新的?delegateSetCounter(dose counter);
//將剩余的票證作為參數傳遞給委托,並異步調用。
這個。BeginInvoke(sc,計數);
//每次暫停2秒鐘
線程。睡眠(2000);
}
}
//在委托部分,只需在接口上的標簽中顯示傳入的值。
私人?作廢?DoSetCounter(int?i_count)
{
lblCounter。文字?=?字符串。Format("還剩{0}張票",I _ count);
}
//線程開始運行。如果需要打開程序,開始運行。把它放在Load事件中就行了。
私人?作廢?btnStart_Click(對象?發件人?EventArgs?e)
{
bg。RunWorkerAsync();
}
//線程暫停,不需要就不需要。這只是為了說明用法。
私人?作廢?btnStop_Click(對象?發件人?EventArgs?e)
{
bg。CancelAsync();
}
//關閉窗體時停止線程。
受保護?覆蓋?作廢?on form closing(FormClosingEventArgs?e)
{
基地。on form closing(e);
bg。CancelAsync();
}
}
}運行後,點擊我們制作的開關按鈕“開始”。
標簽開始每2秒鐘顯示隨機投票。
UI線程上的其他控件和操作不會被阻塞或卡住。
手寫的例子。。。感謝收養