Существуют различные причины использования нескольких потоков в приложении:
- Отзывчивость интерфейса
- Параллельные операции
- Параллельное ускорение
Подход, который нужно выбрать, зависит от того, что вы пытаетесь сделать. Для отзывчивости пользовательского интерфейса рассмотрите, например, BackgroundWorker
.
Для одновременных операций (например, сервер: то, что не имеет , должно быть параллельным, но, вероятно, должно быть одновременным даже в одноядерной системе), рассмотрите возможность использования пула потоков или, если задачи долгоживущие и вам нужно их много, рассмотрите возможность использования одного потока на задачу.
Если у вас есть так называемая смущающая параллельная проблема, которую можно легко разделить на небольшие подзадачи, рассмотрите возможность использования пула рабочих потоков (столько же потоков, сколько ядер ЦП), которые извлекают задачи из очереди. Microsoft Task Parallel Library (TPL) может помочь здесь. Если задание может быть легко выражено как вычисление монадического потока (т. Е. С помощью запроса в LINQ с работой в преобразованиях, агрегациях и т. Д.), Может помочь Parallel LINQ (та же ссылка), которая выполняется поверх TPL.
Существуют и другие подходы, такие как Параллелизм в стиле актера , как в Erlang, которые сложнее эффективно реализовать в .NET из-за отсутствия модели «зеленого потока» или средств для ее реализации, например как CLR-поддерживаемые продолжения.