По мере того, как многопроцессорные и многоядерные компьютеры становятся все более и более повсеместными, просто запуск нового потока - это (относительно) простой и безболезненный способ упрощения кода? Например, в текущем личном проекте у меня есть сетевой сервер, прослушивающий порт. Поскольку это всего лишь личный проект, это просто настольное приложение с интегрированным в него графическим интерфейсом для настройки. Итак, приложение читает что-то вроде этого:
Main()
Read configuration
Start listener thread
Run GUI
Listener Thread
While the app is running
Wait for a new connection
Run a client thread for the new connection
Client Thread
Write synchronously
Read synchronously
ad inifinitum, or till they disconnect
Этот подход означает, что, хотя мне приходится беспокоиться о большом количестве блокировок, с потенциальными проблемами, которые связаны с этим, я избегаю большого количества кода спагетти из асинхронных вызовов и т. Д.
Немного более коварная версия вышла сегодня, когда я работал над кодом запуска. Запуск был быстрым, но он использовал ленивую загрузку для многих конфигураций, что означало, что, хотя запуск был быстрым, на самом деле подключение и использование службы было затруднено из-за задержки, в то время как загружались разные разделы (это было фактически измеримо в реальном время, иногда до 3-10 секунд). Таким образом, я перешел к другой стратегии: при запуске перебираю все и заставляю ленивую загрузку запускаться ... но это заставляло ее запускаться слишком медленно; вставай, иди кофе медленно. Окончательное решение: закинуть петлю в отдельную нить с обратной связью в системном трее, пока она еще загружается.
Это отношение "Мех, брось это в другую ветку, все будет хорошо", хорошо? В какой момент вы начинаете получать убывающую отдачу и / или даже сниженную производительность?