[英]Scheduling a series of tasks with irregular intervals in C#
假設我有一個文件,其中列出了要執行的任務以及執行任務后的時間間隔,例如:
Task_A
2 seconds
Task_B
10 seconds
Task_C
1 minute
Task_A
...
因此,當該列表被讀入然后允許執行時,它將執行Task_A,等待2秒,執行Task_B,等待10秒,依此類推。
我應該怎么做? 我對System.threading.timer進行了一些研究,但這似乎是針對一定間隔執行重復的任務的,但是在這種情況下,我正在讀取一個文件,該文件列出了要執行的操作以及執行該操作之前需要多長時間上面(一種不同的語法,但是這種語法更易於解釋)。
該函數在后台工作,因此我可以執行Thread.Sleep(Timespan),而GUI沒有任何問題,但是感覺就像用鐵砧釘釘子一樣。 作為System.threading.timer的OnTimedEvent的一部分,我也可以更改其自身的Interval的一部分,但是我不確定這是否是一個好習慣,或者是否可行。
最好的方法是什么?
System.Timers.Timer可以提供幫助。
首先,任務的基本類,您可能會通過數據庫或其他方式獲得它。
public class Task
{
public Task()
{
}
public Task(String tName, Int32 iInterval, Int16 iPriority)
{
this.taskName = tName;
this.nextInterval = iInterval;
this.priority = iPriority;
}
private String taskName = String.Empty;
public String TaskName
{
get
{
return this.taskName;
}
set
{
this.taskName = value;
}
}
private Int32 nextInterval = 1;
public Int32 NextInterval
{
get
{
return this.nextInterval;
}
set
{
this.nextInterval = value;
}
}
private Int16 priority = 1;
public Int16 Priority
{
get
{
return this.priority;
}
set
{
this.priority = value;
}
}
}
然后是如何執行部分。
public class ExecuteTasks
{
private System.Timers.Timer myTimer = new System.Timers.Timer();
private Int32 TaskIndex = 0;
private Int32 TaskCount = 3;
protected void StartExecution()
{
myTimer.Interval = 1;
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
myTimer.Start();
}
void myTimer_Elapsed(object sender, EventArgs e)
{
myTimer.Stop();
if (TaskIndex < TaskCount)
{
Task aTask = GetTasks()[TaskIndex++];
StartTask(aTask.TaskName);
SetNextTaskTimer(aTask.NextInterval);
}
}
void SetNextTaskTimer(Int32 Seconds)
{
myTimer.Interval = (Seconds * 1000) - DateTime.Now.Millisecond - 1;//Interval is set in miliseconds
myTimer.Start();
}
void StartTask(String TaskName)
{
ProcessStartInfo objStartInfo = new ProcessStartInfo();
objStartInfo.FileName = TaskName;
Process objProcess = new Process();
objProcess.StartInfo = objStartInfo;
objProcess.Start();
}
//You will be reading your tasks from your database or a file
List<Task> GetTasks()
{
List<Task> lstTasks = new List<Task>();
lstTasks.Add(new Task("Task A", 2, 1));
lstTasks.Add(new Task("Task B", 10, 2));
lstTasks.Add(new Task("Task C", 60, 3));
return lstTasks.OrderBy(le => le.Priority).ToList();
}
}
在給定的時間過去后,我已經開始一些流程。 (您需要為啟動過程提供正確的路徑。即類似
ProcessStartInfo objStartInfo = new ProcessStartInfo();
objStartInfo.FileName = "C:\\Windows\\notepad.exe";
而不只是任務名稱。
最后觸發執行部分。
ExecuteTasks iExecute = new ExecuteTasks();
iExecute.StartExecution();
對於多線程,您可以使用鎖定機制,監視器類等,以滿足您的需要。 即
lock(obj)//lock on an object
{
ExecuteTasks iExecute = new ExecuteTasks();
iExecute.StartExecution();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.