在线程上创建工作队列

时间:2010-12-22 08:35:29

标签: multithreading c#-4.0 queue dispatcher

我喜欢System.Windows.Threading命名空间中的Distpatcher,并希望在类库中使用此对象。但是,由于它是为WPF创建的,并且似乎特定于UI,我觉得我在类库中使用它时滥用其预期目的。

我想知道是否存在其他一些用于相同目的的类(为一个线程创建一个工作项队列),但更适合在类库中使用。基本上我想做的就是创建一个线程,并从另一个线程异步排队一堆代表,让它运行。

我可以很容易地构建一些东西,但我更愿意遵循标准惯例并使用已经证明过的东西。提前谢谢。

2 个答案:

答案 0 :(得分:1)

TPL具有可以实例化以处理工作队列的任务计划程序。查看this msdn link。默认情况下使用全局ThreadPool,您应该能够使用以下内容添加任务:

Task myTask = Task.Factory.StartNew( () =>
{                
    Console.WriteLine("Hello, I'm a queued task."); 
});

如果您想要更复杂的队列管理,那么您可以实现自己的任务调度程序 - 通过上面的msdn链接有很多例子。

答案 1 :(得分:1)

BlockingCollection正是您所需要的。 Take方法阻塞,直到项目出现在队列中,这使得它非常适合这些类型的生产者 - 消费者类场景。

public class Worker
{
  private BlockingCollection<Action> m_Queue = new BlockingCollection<Action>();

  public Worker()
  {
    var thread = new Thread(
      () =>
      {
        while (true)
        {
          Action action = m_Queue.Take();
          action();
        }
      });
    thread.IsBackground = true;
    thread.Start();
  }

  public void QueueWorkItem(Action action)
  {
    m_Queue.Add(action);
  }
}