2009-03-04 40 views
0

我要創建一批定時器作爲局部變量的做一些事情,如:如何防止我的計時器GC回收之前收集執行?

void Foo() 
{ 
    Timer t = new Timer(myTimerCallback,null,1000,Timeout.Infinite); 
} 

不幸的是,他們中的一些是由GC收集他們在1秒鐘後調用myTimerCallback之前。由於我有很多定時器,因此不可能將它們存儲在私有靜態成員中。而且很難找到放置GC.Keeplive(t)的地方。

我該如何讓每個計時器在死亡之前做好自己的事情?

+0

我不想將這些計時器存儲在私人成員中的原因是太多了。我可以試試,但有沒有更好的方法? – 2009-03-04 13:03:17

回答

1

您可以將它們存儲在集合中以保持引用,並在事件方法中從集合中刪除引用。我認爲你需要使用state參數來標識集合中的定時器(在「new timer」語句中將對定時器或集合中的鍵的引用作爲狀態參數傳遞)。

請注意,回調函數在其他線程上執行,因此您將/可能有多個回調函數同時運行。使用鎖定來確保添加/刪除引用是安全完成的。

2

最好的辦法是將它們存儲在一個成員變量中,然後在不再需要它們時將它們處理掉。

1

將它們存儲在成員中,例如List<Timer>

1

爲什麼無法存儲它們?也許你可以在他們的工作完成後將他們從收藏中刪除?

1

重要的是要看到GC.KeepAlive()無法解決您的問題。這只是延長了你的對象的生命到聲明。只要定時器需要保持活動狀態,您就必須循環或阻止。另外請注意,在Debug版本中,本地變量中引用的生存時間是不同的。 JIT保持他們的生活,直到方法結束才允許手錶工作。生產棘手的「在調試中起作用,在發佈模式下不起作用」的問題。

您必須保留對定時器對象的生命參考。這通常是在班級中的一個領域完成的。生命期要求現在傳遞給類對象,只要需要定時器,它就需要保持活動狀態。通常不是問題。如果是,你必須使參考靜態。