我有一個Windows Service應用程序,它使用Threading.Timer
和TimerCallback
以特定間隔進行一些處理。我需要將這個處理代碼一次只鎖定到一個線程。與Threading.Timer一起使用鎖
因此,例如,服務啓動並觸發第一個回調,並啓動一個線程並開始處理。只要處理在下一次回調之前完成,就可以正常工作。所以說例如處理比平常花費的時間稍長一些,並且在另一個線程正在處理時TimerCallback被再次觸發,我需要讓該線程等待,直到另一個線程完成。
這裏是我的代碼示例:
static Timer timer;
static object locker = new object();
public void Start()
{
var callback = new TimerCallback(DoSomething);
timer = new Timer(callback, null, 0, 10000);
}
public void DoSomething()
{
lock(locker)
{
// my processing code
}
}
是該這樣做的安全呢?如果隊列變得相當多,會發生什麼?有更好的選擇嗎?
觸發定時器的好主意從來沒有這樣想過。第二種情況,這是否意味着線程只是退出並不等待? – James 2009-11-09 00:08:46
是的,在第二種情況下,如果當前在處理代碼中有另一個線程,TryEnter立即返回,因此它有效地跳過該定時器間隔。 – 2009-11-09 08:58:47
這應該做的伎倆,謝謝。 – James 2009-11-09 11:53:53