您有幾種選擇。要從本質上最簡單的選項開始,您可以決定將您的應用程序創建爲控制檯應用程序,並將可執行文件作爲Windows任務計劃程序中的任務運行。您只需將可執行文件分配爲程序即可開始執行任務,並讓任務計劃程序爲您處理計時間隔。如果你不關心狀態,這可能是首選的方法,並且如果你不需要,可以防止你不必擔心創建和管理Windows服務。有關如何使用調度程序,請參閱以下鏈接。
Windows Task Scheduler
你能做到這一點,接下來的方法是創建一個Windows服務,並在服務中使用的定時器,具體System.Timers.Timer。從本質上講,您可以在運行流程之前將計時器間隔設置爲您想要通過的時間。然後,您將註冊計時器滴答事件,每次發生該間隔時都會觸發。在這種情況下,你基本上有你想要運行的過程;如果你願意,這可以啓動附加線程。然後,在初始設置後,您只需調用定時器Start()函數或將Enabled屬性設置爲True即可啓動定時器。在MSDN頁面描述對象的例子中可以找到一個很好的例子。有很多教程顯示如何設置Windows服務,所以我不打算進入具體的。
MSDN: System.Timers.Timer
最後,更復雜的是設置一個偵聽的SqlDependency一個窗口服務。如果事情可能發生在應用程序之外的數據庫中,但您需要在應用程序或其他服務中使其知曉,則此技術非常有用。以下鏈接有關如何在應用程序中設置SqlDependency的很好的教程。
Using SqlDependency To Monitor SQL Database Changes
兩件事情,我想從你的原帖指出,並非專門針對你有問題。
如果您正在編寫真正的Windows服務,則不希望該服務停止。該服務應該不斷運行,如果出現異常,應該適當處理並且不要停止服務。
取消標記不必引發異常;只是不調用ThrowIfCancellationRequested()將導致異常不會被拋出,或者如果這是CancellationTokenSource,則在Cancel方法上將參數設置爲false,然後檢查該令牌以查看是否在線程中請求取消並優雅地返回線程如果是這樣。
例如:
CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions options = new ParallelOptions
{
CancellationToken = cts.Token
};
Parallel.ForEach(data, options, i =>
{
try
{
if (cts.IsCancellationRequested) return;
//do stuff
}
catch (Exception ex)
{
cts.Cancel(false);
}
});
我會看看初學者的生產者 - 消費者模式。一個線程可以輪詢並收集工作信息,然後將其傳遞給隊列處理程序。 –
您多長時間輪詢數據庫?這是服務將做的所有*嗎?如果所有服務都是不頻繁地輪詢數據庫並且可能運行一個很長的任務,那麼你可能最好是編寫一個普通的舊控制檯應用程序,並將其設置爲Windows中的計劃任務。 –
您是否有任何鏈接可以在代碼Grant中實現? 吉姆 - 我計劃投票它也許有2分鐘。是的,這是所有服務都可以做到的,但我稍後也可能會添加額外的功能來監控在線提要。 – user2647347