2010-12-22 3 views
2

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

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

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

ответ

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

Мне нравится простота этого решения. Мне не нужно изучать другой API, и это решает мою непосредственную потребность. Тем не менее, я думаю, что функции задачи TPL в решении Тима Баррасса - это то, что мне в конечном итоге нужно будет изучить. – Verax

1

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

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

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

Смежные вопросы