看板 C_Sharp 關於我們 聯絡資訊
各位前輩、先進們好: 不好意思打擾了 我目前的情況是這樣的 我寫了一個介面跟一個class 介面長這樣子: public interface IAlarmedObj { void alarm(DateTime dateTime); } class裡面有 (1) System.timers.timer (2) List, 裡面裝著IAlarmedObj跟其對應的DateTime class的功能是, 每次timer發生elpsed事件時, 會去檢查List中的IAlarmedObj之DateTime, 如果到了就會呼叫它的alarm()方法 因為System.timer.timer是從ThreadPool抓thread來跑elpsed事件的 如果我要操作主執行緒上的東西的話, 有兩個方法: (1) 建立委派用Invoke的方法 (2) 設定timer的SynchronizingObject, 使其在主thread上呼叫elpsed事件 我首先嘗試了第一個方法, 像是以下這樣: ========================= AlarmScheduler.cs ============================== public class AlarmScheduler: System.Windows.Forms.Control { . . . . private delegate void CheckAlarmList(); private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { this.Invoke(new CheckAlarmList(checkAlarmList)); } private void checkAlarmList() { while ((alarmList.Count > 0) && (alarmList.ElementAt(0).dateTime <= DateTime.Now)) { alarmList.ElementAt(0).alarmedObj.alarm(alarmList.ElementAt(0).dateTime); alarmList.RemoveAt(0); } } . . . . . } ================================================================================ 但不知為何會卡在this.Invoke那行, 呼叫之後就停在那裡了, 也沒進入checkAlarmList() 於是乎 我嘗試第二個方法 (當然還是希望最後的解決方案是利用多執行緒的方法) 在AlarmScheduler的建構子裡, 將timer.SynchronizingObject設定為this 但詭異的事情發生了 elpsed事件發生時, 是從子執行緒進入event handler的 但MSDN不是說會從建立該"this"的執行緒進入event handler嗎?@@" 是還有其他什麼步驟被我忽略了嗎@@" 煩請各位高手解惑 感激不盡 m(_ _)m -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.113.12
pico2k:this.Invoke可以用try-catch包起來,檢查是否有exception 07/02 17:57
cloudlim:喔喔 有抓到耶 如下... 07/02 22:26
cloudlim:窗控制代碼建立後才能呼叫控制項上的Invoke或BeginInvoke 07/02 22:27
cloudlim:^視 07/02 22:27
cloudlim:請問這句的意思是要我自己實作Invoke的方法嗎?@@"Y 07/02 22:27
optimist9266:請參考 http://ppt.cc/Ri(D 07/03 01:36
cloudlim:使用optimist大所貼連結的方法可以成功達成我要的功能^^ 07/03 11:39
cloudlim:多謝囉~ 07/03 11:39
cloudlim:不過還是蠻希望知道為什麼我這樣做會失敗 因為網路上好多 07/03 11:40
cloudlim:範例跟MSDN上的範例都這樣寫 真是太詭異了 07/03 11:41
cloudlim:不知道第一個方法中的this.Invoke是不是指向子執行緒上的 07/03 11:42
cloudlim:物件 07/03 11:43
horngsh:this.Invoke中的this是指main thread. 07/03 20:38
cloudlim:喔喔... 原來如此 那真的是很奇怪....ˊˋ 07/03 22:17