У меня есть несколько предложений.
Во-первых, вам нужен способ убедиться, что у вас нет потоков, блокирующих закрытие вашего приложения.Один из надежных способов сделать это - убедиться, что все ваши потоки являются фоновыми.Это может быть немного проблематично, если вам нужно убедиться, что работа потока выполнена до того, как он будет присоединен или прерван.
Во-вторых, вы можете посмотреть на использование класса ThreadPool, который должен сделать создание и использование потоков более эффективным.Пул потоков создан для того, чтобы помочь вам управлять вашими потоками.
В-третьих, вам потребуется метод синхронизации доступа к данным из графического интерфейса пользователя с данными в других потоках.В WPF вы используете Dispatcher, а в WinForms вы будете использовать Invoke.
Кроме того, класс BackgroundWorker может помочь со всем этим, если он вписывается в модель вашего приложения.
В-пятых, события и делегаты могут быть BeginInvoked, что по существу помещает их в другой поток.Это своего рода неявное многопоточность и может быть полезным.
Шестое, и у меня еще не было возможности использовать это. .Net 4 имеет библиотеку параллельных задач, которая может быть вам полезна.
В-седьмых, безопасный общий доступ к данным и синхронизация могут быть выполнены с помощью блокировки и / или монитора.
Надеюсь, это поможет.
-Nate