[問題] 關於System.timers.timer的跨執行緒操作問題

看板C_Sharp (C#)作者 (OswinC)時間14年前 (2011/07/02 17:04), 編輯推噓2(2012)
留言14則, 4人參與, 最新討論串1/1
各位前輩、先進們好: 不好意思打擾了 我目前的情況是這樣的 我寫了一個介面跟一個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

07/02 17:57, , 1F
this.Invoke可以用try-catch包起來,檢查是否有exception
07/02 17:57, 1F

07/02 22:26, , 2F
喔喔 有抓到耶 如下...
07/02 22:26, 2F

07/02 22:27, , 3F
窗控制代碼建立後才能呼叫控制項上的Invoke或BeginInvoke
07/02 22:27, 3F

07/02 22:27, , 4F
^視
07/02 22:27, 4F

07/02 22:27, , 5F
請問這句的意思是要我自己實作Invoke的方法嗎?@@"Y
07/02 22:27, 5F

07/03 01:36, , 6F
07/03 01:36, 6F

07/03 11:39, , 7F
使用optimist大所貼連結的方法可以成功達成我要的功能^^
07/03 11:39, 7F

07/03 11:39, , 8F
多謝囉~
07/03 11:39, 8F

07/03 11:40, , 9F
不過還是蠻希望知道為什麼我這樣做會失敗 因為網路上好多
07/03 11:40, 9F

07/03 11:41, , 10F
範例跟MSDN上的範例都這樣寫 真是太詭異了
07/03 11:41, 10F

07/03 11:42, , 11F
不知道第一個方法中的this.Invoke是不是指向子執行緒上的
07/03 11:42, 11F

07/03 11:43, , 12F
物件
07/03 11:43, 12F

07/03 20:38, , 13F
this.Invoke中的this是指main thread.
07/03 20:38, 13F

07/03 22:17, , 14F
喔喔... 原來如此 那真的是很奇怪....ˊˋ
07/03 22:17, 14F
文章代碼(AID): #1E3jyQb6 (C_Sharp)
文章代碼(AID): #1E3jyQb6 (C_Sharp)