Создание очереди работ в потоке - PullRequest
2 голосов
/ 22 декабря 2010

Мне нравится Distpatcher в пространстве имен System.Windows.Threading, и я хотел бы использовать этот объект в библиотеке классов. Тем не менее, поскольку он был создан для WPF и, похоже, специфичен для пользовательского интерфейса, я чувствую, что злоупотребляю его назначением, используя его в библиотеке классов.

Мне интересно, существует ли какой-либо другой класс, который служит той же цели (создает очередь рабочих элементов для потока), но лучше предназначен для использования в библиотеке классов. По сути, все, что я хочу сделать, - это создать поток и из другого потока асинхронно поставить в очередь группу делегатов для его запуска.

Я мог бы создать что-то довольно легко, но я бы предпочел следовать стандартному соглашению и использовать то, что уже доказано. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

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);
  }
}
1 голос
/ 22 декабря 2010

TPL имеет планировщики задач, которые вы можете создать для обработки рабочих очередей.Проверьте эту ссылку MSDN .По умолчанию используется глобальный ThreadPool, к которому вы сможете добавлять задачи с помощью:

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

Если вы хотите более изощренное управление очередями, вы можете реализовать свой собственный планировщик задач - есть много примеровчерез ссылку msdn выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...