2012-01-30 39 views

回答

2

只需在BackgroundWorkerDoWork事件處理程序中創建一個循環,然後重複該循環,直到計時器停止。更多或更少,像這樣:

var worker = new BackgroundWorker(); 
worker.DoWork += (sender, e) => 
{ 
    var timer = new Timer(); 
    timer.Elapsed += (s, _e) => 
    { 
     // call the database 
    }; 

    timer.Start(); 

    while (timer.Enabled) 
    { 
     // at some point: timer.Stop(); 
    } 

    // if we are here, timer is no longer Enabled 
    // RunWorkerCompleted event will be fired next 
}; 

(顯然我ommitted設置定時器的Interval等)

+0

你怎麼能禁止定時器,如果它在事件中定義的(所以你不必從外部定時器參考)? – CodeZombie 2012-01-30 11:54:17

+0

@ ZombieHunter計時器可以在'Elapsed'事件處理程序中禁用自己,例如,基於從數據庫調用它所獲取的數據(或缺少數據)。但這是一個有效的觀點;當然如果你需要從外部訪問定時器,定時器應該在其他地方聲明。 lambda並不總是最好的選擇。我的代碼只是一個片段,旨在給出一個想法的圖片。 – 2012-01-30 11:59:30

1

BackGroundWorker.RunWorkerCompleted後您的DoWork事件完成時調用。因此,如果確保DoWork事件完成,則您的RunWorkerCompleted事件應由後臺工作人員調用。

另一種解決方案是在您的後臺工作人員之外創建計時器並從計時器控制後臺工作人員實例。在計時器事件中,檢查IsBusy屬性是否設置爲false,並啓動後臺工作程序或在IsBusy爲true時跳過。

樣品:

_worker.DoWork += (sender, e) => 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 

    // Do your database stuff 

    e.Result = databaseResult; 
} 

_timer.Elapsed += (source, e) => 
{ 
    if(!_worker.IsBusy) 
    { 
     _worker.RunWorkerAsync(); 
    } 
} 
相關問題