Отдельный threadPool для каждой задачи - PullRequest
2 голосов
/ 21 июля 2011

У меня есть приложение, в котором есть две основные задачи: кодирование, обработка видео. Эти задачи независимы. Каждую задачу я хотел бы запустить с настраиваемым количеством потоков. По этой причине для одной задачи я обычно использую ThreadPool и SetMaxThreads. Но теперь у меня есть две задачи, и мне бы хотелось, чтобы «два настраиваемых (количество потоков) пула для каждой задачи». Ну, ThreadPool - это статический класс. Итак, как я могу реализовать свою стратегию (легко настраиваемое количество потоков для каждой задачи).

Спасибо

1 Ответ

5 голосов
/ 21 июля 2011

Возможно, вам понадобится собственный пул потоков. Если вы используете .NET 4.0, то на самом деле довольно легко свернуть свой собственный, если вы используете класс BlockingCollection.

public class CustomThreadPool
{
  private BlockingCollection<Action> m_WorkItems = new BlockingCollection<Action>();

  public CustomThreadPool(int numberOfThreads)
  {
    for (int i = 0; i < numberOfThreads; i++)
    {
      var thread = new Thread(
        () =>
        {
          while (true)
          {
            Action action = m_WorkItems.Take();
            action();
          }
        });
      thread.IsBackground = true;
      thread.Start();
    }
  }

  public void QueueUserWorkItem(Action action)
  {
    m_WorkItems.Add(action);
  }
}

Это действительно все, что нужно. Вы должны создать CustomThreadPool для каждого фактического пула, которым хотите управлять. Я разместил минимальный объем кода, чтобы запустить пул сырых потоков. Естественно, вы можете настроить и расширить эту реализацию в соответствии с вашими потребностями.

...