2013-03-19 24 views
0

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

我想过使用任务和ContinueWith但我没有任何线索,我应该从哪里开始有一个完全处理我的需求的类。

我很抱歉没有提供代码或错误的东西,我希望有人能得到我指向并帮助我的观点。并预先感谢您。

+0

你应该至少说明你有什么到目前为止已经试过。 – 2013-03-19 19:00:39

回答

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

}