2017-06-06 72 views
0

我的問題更多的是關於到達相同的目的地,但必須有另一種方式。現在即時創建一個DateTime並與另一個DateTime比較,並檢查,如果我設置的時間差可能是正確的。到目前爲止這麼好,但我不能接受,每當循環將進入該代碼時,我都會創建一個新的屬性。在windows服務上定義時間後運行方法

是否有任何可能的方式到達相同的目的地,但以某種更有效的方式?

我得到了你們一些示例代碼在這裏:

 private void RunService() 
     { 
      // Runs as long as the service didn't got a stop call. 
      while (!SetStop) 
      { 
       //Get MinutesToWait 
       this.MinutesToWait = 5; 

       DateTime CheckRunTime = this.LastRun; 
       CheckRunTime.AddMinutes(this.MinutesToWait); 

       if (DateTime.Now >= CheckRunTime) 
       { 
        // Imagine some good and smart and totally runnable code? 
       } 
      } 
     } 
+0

你可以使用一個計時器https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx –

+0

你是否發現過'System.Threading.Timer '對象?但說實話,我會*強烈*敦促你重新考慮。 [*「如果您正在編寫運行計時器的Windows服務,則應重新評估您的解決方案。」*](https://weblogs.asp.net/jongalloway/428303)計劃任務將更合適。 –

+0

@CodyGray這是一個非常有趣的博客帖子。我應該考慮用計劃任務來做這件事......但是,我仍然對解決方案感興趣。 – Cataklysim

回答

0

如果我理解正確的話,你想要做的是執行一段代碼,一段時間後,服務開始。如果是這樣的話,那麼你最好的選擇是使用timer

首先,您必須將您想要等待的時間量轉換爲毫秒。例如,5分鐘等於300000ms。然後,您必須將要執行的代碼移動到單獨的方法。舉例來說,我將這個方法命名爲RunCode()。最後,你創建你的計時器,如下所示:

private void RunService() 
{ 
    var timer = new Timer(300000); 
    timer.Elapsed += (s, e) => this.RunCode(); 
    timer.Start(); 
    Thread.Sleep(Timeout.Infinite); 
} 

我們在這裏做的是以下內容。

  1. 實例化與300000ms
  2. 訂閱定時器的Elapsed事件,在指定的時間已經過去了
  3. 啓動定時器
  4. 永遠沉睡的主線程的時候觸發的間隔定時器。該行是可選的。無論你是否需要它取決於你的程序的結構。如果在啓動定時器之後代碼中沒有任何其他事情發生,主線程和擴展程序將退出整個程序。然而,通過無限超時睡眠,我們可以防止這種情況發生。

如果您確定這一點,延遲執行代碼,是您想要的,那麼我提供的解決方案應該工作得很好。不過,我擔心這可能是XY problem,這意味着這是您爲解決更好解決的另一個問題而提出的解決方案。所以我不得不問,爲什麼你需要這個服務?

+0

科迪格雷已經評論說,Windows服務可能不是最好的方法。我只是想要一個計劃的例程,因爲後面的代碼以及它的工作原理。我檢查數據,將它與另一個實體進行比較,並可能寫入數據庫條目。這個例程在完成之前不需要每次執行都會被觸發。另外,我們不知道要檢查的數據庫條目有多大,我們希望可能會將檢查時間更改爲另一個值。計劃的任務就像這是我們正在進行的操作所必需的。 – Cataklysim

+0

另外:我使用'System.Threading'引用,並通過去像你的代碼我得到的標記,從定時器的構造函數不能處理「300000」或doenst知道'Elapsed' ... – Cataklysim

+0

這個計時器是從'系統.Timers'命名空間。 System.Threading.Timer類是不同的。除其他外,我建議使用'System.Timers.Timer'。該替代方案不是線程安全的。你可以在這裏找到一個綜合的比較(https://web.archive.org/web/20150329101415/https://msdn.microsoft.com/en-us/magazine/cc164015.aspx)。 – stybl

0

使用System.Timers

static void Main(string[] args) { 

     Timer T = new Timer(); 
     T.Elapsed += Run; 
     T.Interval = 100; 
     T.Start(); 

} 
static void Run(object source, ElapsedEventArgs e) { 

} 
+0

也許給我一些例子是如何工作的?總是期望現在問的人不會總是現在在做什麼?例如,他可能不知道您正在訂閱自定義事件。也給你的解決方案的解釋。例如,查看Sty的答案。 – Cataklysim

相關問題