using System;using System.Threading;namespace Reminder{public class Reminder{public Timer stateTimer;public void Check(){AutoResetEvent autoEvent = new AutoResetEvent(false);StatusChecker statusChecher = new StatusChecker();TimerCallback tcb = statusChecher.CheckInventory;stateTimer = new Timer(tcb, autoEvent, 1000, 5000);//autoEvent.WaitOne(1, false);stateTimer.Change(5000, 1000);stateTimer.Dispose();}}class StatusChecker{public void CheckInventory(object stateInfo){AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;int inventoryShortageCount = 5;if (inventoryShortageCount > 0){System.Windows.Forms.MessageBox.Show("");}}}}在Form里面調用private void Form1_Load(object sender, EventArgs e){Reminder r = new Reminder();r.Check();//r.stateTimer.Dispose();//如果這樣,Timer就直接被Dispose掉了,如何才能在Form里面隨意停止Timer}autoEvent.WaitOne(1, false);stateTimer.Change(5000, 1000);stateTimer.Dispose();這三條后來測試用的,不是原來代碼
3 回答
慕森王
TA貢獻1777條經驗 獲得超3個贊
Threading.Timer 屬于100% 多線程
Timers.Timer 默認多線程,可設置為單線程
既然是多線程,不管通過回調 還是事件 執行任務,都是開啟的另一個線程;
你可以暫?;蜾N毀計時器(Timer)本身,但是不能操作里面新開線程的任務,這也是多線程設計的期望方式,因為你不知道 超線程里面到底執行到哪兒了。
但是,像我這種(刁民)有時候就喜歡那么橫,所以就把 新開的任務裝在一個 new Thread()里面,這樣就可以操作這個線程了,(到時只需要暴力abort() 終止這個線程就行)。
Threading.Timer 暫停: Change(-1,任意值); 啟動: Change(大于等于0,時間間隔);
Timers.Timer 暫停: Stop(); 啟動:Start();
再次提醒,這里暫停的意思是 計時器不在重新啟動,不是終止計時器的里面任務。
- 3 回答
- 0 關注
- 255 瀏覽
添加回答
舉報
0/150
提交
取消
