0

我正在开发一个应用程序,我只想从一个地方执行任务,这样每次我添加新任务时,它都会添加到要执行的行中,而且我希望每个任务都有一个优先级,所以如果我设置任务优先级到 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 回答