Простой многопоточный вопрос - PullRequest
4 голосов
/ 15 февраля 2010

Хорошо, я уже должен знать ответ, но ...

Я хочу выполнить несколько различных задач параллельно в отдельном потоке и дождаться завершения всех потоков, прежде чем продолжить. Я знаю, что мог бы использовать ThreadPool.QueueUserWorkItem() или BackgroundWorker, но не хотел их использовать (без особой причины).

Так является ли приведенный ниже код правильным способом параллельного выполнения задач в фоновом потоке и ожидания их завершения обработки?

Thread[] threads = new Thread[3];
for (int i = 0; i < threads.Length; i++)
{
    threads[i] = new Thread(SomeActionDelegate);
    threads[i].Start();

}

for (int i = 0; i < threads.Length; i++)
{
    threads[i].Join();
}

Я знаю, что этот вопрос уже задавали 100 раз, поэтому спасибо за ваш ответ и терпение.

Ответы [ 3 ]

4 голосов
/ 15 февраля 2010

Да, это правильный способ сделать это. Но если SomeActionDelegate относительно мало, тогда затраты на создание 3 потоков будут значительными. Вот почему вы, вероятно, должны использовать ThreadPool в любом случае. Хотя у него нет чистого эквивалента Join.

BackgroundWorker в основном полезен при взаимодействии с графическим интерфейсом.

1 голос
/ 15 февраля 2010

, если вы используете (или будете использовать .Net 4.0), попробуйте использовать Задача параллельной библиотеки

1 голос
/ 15 февраля 2010

Всегда трудно сказать, что такое «правильный» путь, но ваш подход работает правильно.

Однако, используя Join, поток пользовательского интерфейса (если основной поток является потоком пользовательского интерфейса) будет заблокирован, поэтому пользовательский интерфейс замораживается. Если это не так, ваш подход в основном нормальный, даже если у него разные проблемы (масштабируемость / количество одновременных потоков и т. Д.).

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