Вы правы, что BackgroundWorker здесь не будет работать.Он действительно предназначен для работы со средами с графическим интерфейсом (например, WinForms и WPF), где основной поток постоянно занят проверкой / выполнением насоса сообщений (который обрабатывает все события Windows, такие как Click и Resize, а также события, происходящие из backgroundWorker).Без очереди событий Mainthread закончится.А без очереди событий BackgroundWorker также не может вызывать обратные вызовы в главном потоке.
Действительно, выполнение многопоточности на консоли в десятки раз сложнее, потому что у вас нет Message Pump для решения двух больших проблем:как сохранить основной поток живым и как сообщить основному потоку изменений, необходимых в пользовательском интерфейсе.Программирование на основе событий оказалось идеальной площадкой для многопоточности.
Есть несколько решений:
Расширение вашего консольного приложения с помощью Message Pump.Поскольку это немного больше, чем потоковая коллекция делегатов (где другие потоки только добавляют материал) и цикл while, это удивительно просто: Консольное приложение C # + обработка событий
ThreadPool и ThreadКлассы.Они существуют до тех пор, как BackgroundWorker (начиная с .NET 2.0), и, похоже, предназначены для решения проблемы с консолью.Вам все еще нужно заблокировать ваш основной поток с помощью цикла.ThreadPool также будет ограничивать количество потоков чем-то подходящим для реальной машины.Вам следует избегать фиксированных ограничений потоков и вместо этого полагаться на функции ThreadPooling операционной системы, чтобы решить вопрос «сколько потоков должно запускаться одновременно?».Например, фиксированное число 5 потоков может быть идеальным для вашей 6-ядерной машины разработки.Но это было бы слишком много для одноядерного настольного компьютера.И это было бы бессмысленным узким местом на сервере, который легко может содержать от 16 до 64 ядер с гигабайтами оперативной памяти.
Если у вас есть .NET 4.0 или более поздняя версия, то недавно добавленный паралеллизм задач может стоить посмотреть.http://msdn.microsoft.com/en-us/library/dd537609.aspx Он имеет встроенную функцию ThreadPooling, ограниченные возможности приоритетов и цепочку банок и легко объединяет несколько задач (все, что может сделать Thread, может сделать Task).Использование Task также позволяет использовать async и await Keywords: http://msdn.microsoft.com/en-us/library/hh191443.aspx Опять же, вы не можете обойти блокировку основного потока в консольном приложении.