4

私は多くの優れた.NETスケジューリングエンジンを見つけました。特にQuartz.Netは非常に有望に見えます。ただし、日付と時刻だけでなく、思いついたものすべてからトリガーできるスケジューリングエンジンが必要です。たとえば、日付/時刻ベースのトリガーに加えて、プロセスが開始されたとき、コンピューターがロックされたとき、WMIイベントがオフになっているときなどにトリガーしたい場合があります。

私が探しているのは、適切なインターフェイスを実装し、条件が満たされたときにトリガーを起動できるようにするソリューションです。このようなものはすでに存在しますか、それとも私自身ですか?

これが私が見たカップルです:

これは、私の.NETアプリケーション内で実行する必要があります。このタイプのトリガーをサポートするようにQuartz.Netを変更することを検討しましたが、日付/時刻トリガーの概念は根付いています。ジョブとトリガーをデータベースに保存する必要がないため、独自のスケジューラーを作成する方がおそらく簡単です。

キュー、優先度、スレッドプールなどの詳細を実装することを心配する必要がないように、既存のスケジューリングシステムを使用したいのですが、もちろん、必要なことは実行します。 。

4

1 に答える 1

1

プロパティとメソッドTaskを実装する基本クラスまたはインターフェイスを宣言できます。boolNeedsToRunRun()

次に、個々のタスクごとに (またはデリゲート関数、タスク タイプを使用して) Task クラスを継承し、そのタスクを実行する必要があるかどうかを確認するために必要なすべてのカスタム要件を定義し、必要な場合は呼び出すことができます。Run()その特定のタスクの方法。

すべてのタスクを に追加し、List<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 に答える