2012-12-24 77 views
0

我在我的程序中執行了很長時間的方法。所以,我希望它在晚上執行,或者在用戶不使用應用程序時執行。編程方法執行的開始時間 - 當時開始執行的方法

用戶將在文本框中輸入時間和日期,我會將該值保存在數據庫中。

比方說,用戶進入27th December 2012, midnight.

我想Example()方法開始在確切的時間執行。

有沒有辦法編程呢?

+0

什麼是「執行長時間」? – bonCodigo

+0

這是否已經作爲Windows服務運行? –

+0

@MichaelPerrenoud嗯,沒有。爲什麼? –

回答

2

有多種選擇,你有什麼發現?

例如,您可以通過Windows任務調度程序運行任務,或者運行一個服務來定期檢查是否已經接近啓動特定任務的時間,如果是,則這樣做。

0

創建一個System.Timers.Timer對象。計算用戶輸入的時間減去當前時間(以毫秒爲單位)。將時間傳遞給計時器的構造函數,並將其作爲Elapsed事件處理程序。

0

試試這個:

if (DateTime.Now == your time) 
{ 
    // do your process 
} 
0

您在這裏有幾個選項 - 你可以有一個民意調查工作的數據庫來執行服務,當它的時候它執行的實例方法。 您可以編程方式創建一個Windows計劃任務,這種方式你不需要輪詢。

但是,在MVC中沒有任何方法可以提前定時接聽電話。

0

您可以使用Threading.Timer一定的延遲之後,開始你的方法:

DateTime date = // when you need method to run 
TimeSpan dueTime = date - DateTime.Now; 
Timer timer = new Timer(_ => Example(), null, dueTime, new TimeSpan(0)); 

您可以指定時間段TimeSpan(24, 0, 0)每天執行方法。

2

你或許應該看看現有的庫作業調度Quartz。特別是如果您計劃遞歸作業。

石英可能嵌入到現有應用程序中,或作爲獨立應用程序單獨運行。

0

由於@Ulises提到您可以使用作業調度程序,或者如果可以分離該任務的邏輯,則可以使用Windows調度程序。但是如果你需要在你的程序裏面做,那只是編碼問題。首先監督方法:

static void Supervisor() 
{ 
    while (true) 
    { 
     DateTime time = ReadTimeFromFile(); 

     if (Math.Abs((DateTime.Now - time).TotalMinutes) <= 1) 
     { 
      DeleteTimeFile(); // to indicate task is done 

      RunTask(); 

      break; 
     } 

     Thread.Sleep(TimeSpan.FromSeconds(5)); 
    } 
} 

然後將目標時間寫入文件中。 並在程序的開始(或其他合適的地方):

new Task(Supervisor, TaskCreationOptions.LongRunning).Start(); 

它使用TaskCreationOptions.LongRunning選項來初始化一個單獨的線程來此之外,你線程池是非常重要的。