我正在开发一个应用程序,我只想从一个地方执行任务,这样每次我添加新任务时,它都会添加到要执行的行中,而且我希望每个任务都有一个优先级,所以如果我设置任务优先级到 HIGH 它被添加到行的顶部,因此它立即执行,另一方面,如果我将优先级设置为 Low,它被添加到行的末尾等等......
我考虑过使用 Tasks 和 ContinueWith,但我不知道我应该从哪里开始有一个完全满足我需求的类。
我很抱歉没有提供代码或错误,我希望有人能明白我所指的并帮助我。并提前谢谢你。
好吧,如果您不需要为高优先级任务腾出空间,您可以使用Task
and创建一个简单的辅助类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);
}
}
}