Как управлять ВСЕМИ запущенными потоками в консольном приложении C #? - PullRequest
0 голосов
/ 27 апреля 2011

У меня возникла проблема с параллельным управлением потоком в консольном приложении.
Я запускаю 10 потоков параллельно, и все потоки выполняют какую-то конкретную задачу.
В случае, если какая-либо задача закончена / завершена, я делаю остановку / завершение потока и немедленно запускаю новый экземпляр потока.
Я хочу 10 потоков, поэтому любой поток остановится / закончится, а затем создаст новый поток.
но каждый раз, когда мне нужно 10 потоков в режиме работы в консольном приложении &
Это должно быть параллельной работой с использованием консольного приложения C #.
Как я могу запустить 10 потоков в консольном приложении C #?

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

В конце каждого потока ставим блокировку на некоторый общий объект (lock (obj) {}). Затем удалите текущий поток из коллекции потоков, которые у вас есть. Если collection.Count меньше 10, создайте новый и поместите в коллекцию. Отпустите замок.

private List<Thread> threads = new List<Thread>();

private void ThreadFunction() {
  // do something
  // here before the lock
  lock (threads) {
    threads.Remove(Thread.CurrentThread);
    if (thread.Count < 10) {
      Thread t = new Thread(ThreadFunction);
      threads.Add(t);
      t.Start();
    }
  }
}

Обязательно перехватите все исключения внутри потока, иначе ваш код потерпит неудачу, когда возникнет исключение потока. Это означает, что часть кода всегда вызывается (кроме исключений Thread abord, но это не имеет значения).

Но, как уже говорилось, я думаю, что вы должны использовать ThreadPool для такой задачи ...

0 голосов
/ 27 апреля 2011

Книга по темам в .Net: http://www.albahari.com/threading/ Одно это, вероятно, ответит на все ваши вопросы.

В зависимости от того, для чего вы используете эти потоки (возможно, вы говорите о выполнении транзакций в фоновом режиме), вы можете использовать BackgroundWorker.

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

BackgroundWorker позволяет работать только с событиями Begin / End / Progress, что значительно снижает вероятность отладки.

...