作者cloudlim (OswinC)
看板C_Sharp
標題[問題] 關於System.timers.timer的跨執行緒操作問題
時間Sat Jul 2 17:04:24 2011
各位前輩、先進們好:
不好意思打擾了
我目前的情況是這樣的
我寫了一個介面跟一個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
→ 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