2010-03-22 55 views
6

問題:如何在WinForms應用程序中安排任務? (a)如果有一個開源組件可以很好地實現這個功能,那麼可以使用(b)什麼是最好的方法/ .NET類/方法。如何在WinForms應用程序中安排任務?

背景:

  • Winforms應用程序(.NET v3.5版本,C#,VS2008)
  • 我假設我會一直運行WinForms應用程序,只是不用時最小化到系統托盤使用
  • 想要一個簡單的方法(不想進入單獨的服務運行UI Winforms應用程序會談等)
  • 希望能夠讓用戶選擇安排同步的頻率(例如每小時,每天 - 接機時間等)
  • 能夠在時間當調度火災運行的代碼塊(假定它可以被包裝爲例如一個BackgroundWorker任務)
  • 該應用程序總是在運行&出現在系統托盤

回答

2

如果你不想要一個Windows服務,然後啓動與Windows應用程序我選項。你可以使用下面的代碼來做到這一點。

Dim regKey As RegistryKey 
regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True) 
regKey.SetValue(Application.ProductName, Application.ExecutablePath) 
regKey.Close() 

通過安排同步,你是什麼意思?這是一個差異化的服務?然後,您可以使用計時器,然後將用戶設置存儲在xml文件或數據庫中。如果你想要一個簡單的存儲,那麼你可以使用My.Settings

編輯:我認爲唯一的方法是檢查應用程序啓動的日期,然後定期檢查日期。另一種選擇是以編程方式使用任務調度程序。 Task Scheduler Managed Wrapper是一個開源的包裝,你可以嘗試。

+0

對不起,我使用「同步」只是使事情複雜化。這只是一個Windows應用程序,用戶可以安排「任務」定期運行。我有一個數據庫,所以可以在那裏存儲數據。因此,使用Timer類看起來是一條可行的路線,但是您必須在代碼中執行日期/時間檢查嗎? (因爲計時器似乎沒有任何基於日曆的日程安排) – Greg 2010-03-22 04:45:49

+0

我編輯了我的問題。請檢查。 – Shoban 2010-03-22 04:54:24

+0

是...這個(即Task Scheduler Managed Wrapper)是我正在捕魚的那種東西......你認爲這是一種強健的方法嗎?用更簡單的話來說,使用定時器並在應用程序中寫入日期/時間檢查代碼會更健壯/更安全嗎?強大的我想我的意思是我可以假設它可以在沒有任何gottchas(alberit XP,或vista或Windows 7等)的任何PC上工作 – Greg 2010-03-22 05:02:10

1

所以你想運行應用程序中預定義代碼的任務,而不是外部exes?

  • 使用系統托盤圖標製作一個winforms應用程序。如果要使用單擊進行部署,請使發佈服務器名稱爲「啓動」,以便快捷方式安裝在啓動目錄中。

  • 使用計時器檢查計劃並根據需要啓動線程。將本地日程安排存儲在XML文件中,以便可以使用LINQ輕鬆查詢。

  • 您正在使用Background worker運行您的任務,所以線程已被使用。

如果您想使用Windows任務計劃程序,但是有一個API。不是一個優雅的模塊,但它工作得很好。

+0

確定 - 所以像得到定時器到5分鐘進行設置,所以每5分鐘你會自己檢查一次(在你自己的應用程序代碼中)以查看你是否已經越過了下一個預定點? (例如,你不能說每天晚上11點就直接提醒我的代碼?) – Greg 2010-03-22 04:43:14

+1

使用計時器並不準確,因爲你正在以預定的時間間隔進行檢查。如果你想精確的話,使用Windows任務計劃程序:它有一個相當優雅的API _wrapper_。 – 2010-03-22 05:25:05

+0

感謝馬克西姆 - 請注意我的問題在另一個答案,以「哦......如果我跑...」 - 任何關於這個歡迎的反饋 – Greg 2010-03-22 05:40:18

10

實際上有東西直接內置到Windows這將做到這一點。它被稱爲Windows任務計劃程序!而不是讓Windows應用程序坐着並等待正確的時間運行一段代碼,最好使用底層系統實用程序並將代碼片段存儲在單獨的可執行文件中運行:它更容易效率更高

我以前使用過任務計劃程序來配置我的應用程序以啓動一個非常具體的計劃。執行.NET應用程序的最佳方法是使用使用this handy little library

基本上,要完成您在問題中陳述的內容,您需要製作一個提供GUI的Windows應用程序。這個圖形用戶界面應該有選項來規範任務的創建和變更。任務應該啓動您必須運行的代碼(您應該將其存儲在單獨的可執行文件中,可能是透明的,因此隱藏的WinForms應用程序)。

下面是代碼from the CodeProject article of the library itself,說明如何創建任務:

//Get a ScheduledTasks object for the local computer. 
ScheduledTasks st = new ScheduledTasks(); 

// Create a task 
Task t; 
try { 
    t = st.CreateTask("D checker"); 
} catch (ArgumentException) { 
    Console.WriteLine("Task name already exists"); 
    return; 
} 

// Fill in the program info 
t.ApplicationName = "chkdsk.exe"; 
t.Parameters = "d: /f"; 
t.Comment = "Checks and fixes errors on D: drive"; 

// Set the account under which the task should run. 
t.SetAccountInformation(@"THEDOMAIN\TheUser", "HisPasswd"); 

// Declare that the system must have been idle for ten minutes before 
// the task will start 
t.IdleWaitMinutes = 10; 

// Allow the task to run for no more than 2 hours, 30 minutes. 
t.MaxRunTime = new TimeSpan(2, 30, 0); 

// Set priority to only run when system is idle. 
t.Priority = System.Diagnostics.ProcessPriorityClass.Idle; 

// Create a trigger to start the task every Sunday at 6:30 AM. 
t.Triggers.Add(new WeeklyTrigger(6, 30, DaysOfTheWeek.Sunday)); 

// Save the changes that have been made. 
t.Save(); 
// Close the task to release its COM resources. 
t.Close(); 
// Dispose the ScheduledTasks to release its COM resources. 
st.Dispose(); 

注:priority選項從來沒有工作對我來說,總是崩潰的應用程序。我建議你放棄它;通常情況下,這並沒有太大的區別。

有更多的代碼樣本on the article page,其中一些展示如何更改任務的設置,列出所有計劃任務等

+0

thansk Maxim - 任何想法如何比較使用Shoban建議的任務計劃管理包裝? http://taskscheduler.codeplex.com/ – Greg 2010-03-22 05:28:56

+0

剛剛檢查出一個,它似乎更新。此外,我不知道我提出的建議是否適用於Task Scheduler 2.0(Vista&Win7),但我會嘗試。 – 2010-03-22 05:42:22