簡體   English   中英

在C#中以不規則的間隔計划一系列任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM