连续创建和执行任务

时间:2013-03-19 18:52:20

标签: c# winforms

我正在开发一个应用程序,其中我只想从一个地方执行任务,这样每次我添加新任务时它都会被添加到要执行的那一行中。另外,我想要每个任务的优先级,所以如果我设置任务优先级为HIGH它被添加到行的顶部,所以它立即执行,另一方面,如果我将优先级设置为低,它将被添加到行的末尾,依此类推......

我想过使用Tasks和ContinueWith,但我没有任何线索,我应该从哪里开始有一个完全满足我需求的课程。

我很抱歉没有提供代码或某些错误我希望有人能够明白我指点并帮助我。并提前感谢你。

1 个答案:

答案 0 :(得分:1)

好吧,如果你没有需要为高优先级任务腾出空间,你可以使用TaskContinueWith创建一个简单的帮助类:

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);
        }
    }

}