4

我发现了许多很棒的 .NET 调度引擎,特别是 Quartz.Net 看起来很有前途。但是,我需要一个调度引擎,它不仅可以让我触发日期和时间,还可以触发我能想到的任何事情。例如,除了基于日期/时间的触发器之外,我可能希望在看到进程已启动、计算机锁定、WMI 事件关闭等时触发。

我正在寻找的是一种解决方案,它允许我实现适当的接口并在满足我的条件时触发触发器这样的事情已经存在还是我一个人?

这是我看过的一对:

这需要在我的 .NET 应用程序中运行。我研究了修改 Quartz.Net 以支持这种类型的触发,但日期/时间触发的概念只是根深蒂固;编写自己的调度程序可能会更容易,因为我不需要将作业和触发器保存到数据库中。

我宁愿在现有的调度系统上工作,这样我就不必担心实现队列、优先级、线程池等坚韧不拔的细节……但我当然会做我必须做的事情.

4

1 回答 1

1

您可以声明一个基Task类或接口,无论您喜欢哪个实现bool属性NeedsToRun和方法Run()

然后,您可以为每个单独的任务(或使用委托函数、任务类型)继承 Task 类,并定义您需要的所有自定义要求,以检查该任务是否需要运行,如果需要,请调用该Run()特定任务的方法。

将所有任务添加到 aList<Task>并定期迭代它们以查看实际需要运行的任务,瞧;你有一个非常简单但有效的调度程序。

就个人而言,我追求的是基于优先级的调度程序,而不是你描述的事件驱动的调度程序,所以我实现了一个Func<bool>来确定一个任务是否需要运行并Action实际运行它。我的代码如下:

public class Task : IComparable<Task>
{
    public Task(int priority, Action action, Func<bool> needsToRun, string name = "Basic Task")
    {
        Priority = priority;
        Name = name;
        Action = action;
        _needsToRun = needsToRun;
    }

    public string Name { get; set; }

    public int Priority { get; set; }

    private readonly Func<bool> _needsToRun;

    public bool NeedsToRun { get { return _needsToRun.Invoke(); } }

    /// <summary>
    /// Gets or sets the action this task performs.
    /// </summary>
    /// <value>
    /// The action.
    /// </value>
    public Action Action { get; set; }

    public void Run()
    {
        if (Action != null)
            Action.Invoke();
    }

    #region Implementation of IComparable<in State>

    /// <summary>
    /// Compares the current object with another object of the same type.
    /// </summary>
    /// <returns>
    /// A value that indicates the relative order of the objects being compared. The return value has the following meanings: Value Meaning Less than zero This object is less than the <paramref name="other"/> parameter.Zero This object is equal to <paramref name="other"/>. Greater than zero This object is greater than <paramref name="other"/>. 
    /// </returns>
    /// <param name="other">An object to compare with this object.</param>
    public int CompareTo(Task other)
    {
        return Priority == other.Priority && Name == other.Name ? 1 : 0;
    }

    #endregion
}

但我认为这可以适应订阅事件并设置一个标志,以确保NeedsToRun在该事件被相当容易地触发时返回 true。

于 2012-09-07T21:50:33.257 回答