[問題] 關於System.timers.timer的跨執行緒操作問題
各位前輩、先進們好:
不好意思打擾了
我目前的情況是這樣的
我寫了一個介面跟一個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
07/02 17:57, 1F
→
07/02 22:26, , 2F
07/02 22:26, 2F
→
07/02 22:27, , 3F
07/02 22:27, 3F
→
07/02 22:27, , 4F
07/02 22:27, 4F
→
07/02 22:27, , 5F
07/02 22:27, 5F
推
07/03 01:36, , 6F
07/03 01:36, 6F
→
07/03 11:39, , 7F
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
07/03 11:41, 10F
→
07/03 11:42, , 11F
07/03 11:42, 11F
→
07/03 11:43, , 12F
07/03 11:43, 12F
推
07/03 20:38, , 13F
07/03 20:38, 13F
→
07/03 22:17, , 14F
07/03 22:17, 14F
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章