Отладка и модульное тестирование многопоточного кода общеизвестно трудны, и я не верю, что существуют какие-либо проверенные и надежные решения для отладки нескольких потоков.
Однако вы можете упростить написание многопоточного кода, сделав несколько заметок из функциональных языков программирования:
Использовать неизменные структуры данных:
очень легко писать многопоточный код на F #, Haskell, Erlang, OCaml и т. Д., Потому что структуры данных и значения в этих языках неизменны, что означает, что вы не можете изменять переменную после ее назначения. По сути, это означает, что каждая переменная объявлена константой, и нет таких методов, как List.Add или Dictionary.Add, которые изменяют коллекцию.
Неизменяемость означает, что ничто не может быть изменено после его объявления, поэтому вам никогда не придется беспокоиться о том, что один поток изменяет общее состояние, используемое другим потоком. Поскольку это так, вам не нужно использовать блокировки или мьютексы в своем коде, и вы устранили целый класс ошибок потоков, связанных с условиями гонки и мертвыми блокировками.
Положитесь на передачу сообщений для обмена данными между процессами
Прочитайте эти сообщения в блоге:
Erlang - замечательный язык, особенно потому, что его модель параллелизма масштабируется до 1000 и 1000 компьютеров. Вместо того, чтобы предоставлять потокам доступ к общему состоянию, он использует передачу сообщений для передачи информации из одного потока в другой.
Использование каналов для синхронизации потоков
Вот хорошее видео на языке Newsqueak:
http://video.google.com/videoplay?docid=810232012617965344
Он описывает интересный подход Newsqueak к параллелизму. Он использует объекты, называемые «каналами», для передачи данных из одного потока в другой. Легко найти C # реализации каналов.
Помните, что вы можете многое узнать о решении проблем в .NET, изучая, как те же проблемы решаются на других языках.