0

新しいタスクを追加するたびにその行に追加されて実行されるように、1 つの場所からのみタスクを実行するアプリケーションを開発しています。また、各タスクの優先度が必要なので、タスクの優先度を設定するとHIGH にすると、行の先頭に追加されるのですぐに実行されます。一方、優先度を Low に設定すると、行の最後に追加されます...

Tasks と ContinueWith を使用することを考えましたが、自分のニーズを完全に処理するクラスをどこから始めればよいかわかりません。

コードや何かのバグを提供できなくて申し訳ありません。誰かが私が指している点を理解して助けてくれることを願っています。よろしくお願いします。

4

1 に答える 1

1

優先度の高いタスクのためのスペースを確保する必要がない場合は、 Taskandを使用して単純なヘルパー クラスを作成できContinueWithます。

public class SimpleWorkQueue
{
    private Task _main = null;

    public void AddTask(Action task)
    {
        if (_main == null)
        {
            _main = new Task(task);
            _main.Start();
        }
        else
        {
            Action<Task> next = (t) => task();
            _main = _main.ContinueWith(next);
        }
    }
}

優先度の高いタスクが必要な場合は、おそらくより多くのタスクを自分で処理する必要があります。AddTask()すべての受信タスクが のリストに挿入され、単一のワーカー スレッドがそのリストからタスクを消費するプロデューサー/コンシューマーの例を次に示します。

public class PrioritizedWorkQueue
{
    List<Action> _queuedWork;
    object _queueLocker;
    Thread _workerThread;

    public PrioritizedWorkQueue()
    {
        _queueLocker = new object();
        _queuedWork = new List<Action>();

        _workerThread = new Thread(LookForWork);
        _workerThread.IsBackground = true;
        _workerThread.Start();
    }
    private void LookForWork()
    {
        while (true)
        {
            Action work;
            lock (_queueLocker)
            {
                while (!_queuedWork.Any()) { Monitor.Wait(_queueLocker); }

                work = _queuedWork.First();
                _queuedWork.RemoveAt(0);
            }
            work();
        }
    }

    public void AddTask(Action task, bool highPriority)
    {
        lock (_queueLocker)
        {
            if (highPriority)
            {
                _queuedWork.Insert(0, task);
            }
            else
            {
                _queuedWork.Add(task);
            }
            Monitor.Pulse(_queueLocker);
        }
    }

}
于 2013-03-19T22:13:40.313 に答える