當前位置:編程學習大全網 - 編程語言 - 如何取消多線程編程

如何取消多線程編程

1,這種情況下多線程當然是把最耗時的步驟和循環部分放到線程裏。

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線程上的其他控件和操作不會被阻塞或卡住。

手寫的例子。。。感謝收養

  • 上一篇:電氣工程及其自動化專業要看什麽書
  • 下一篇:城固職教中心是公辦還是私立
  • copyright 2024編程學習大全網