Я с Джейсоном, степпинг больше не покажет правду.
Вам действительно лучше обрабатывать каждую строку кода методом, который также увеличивает счетчик с помощью Interlocked.Increment и добавляет счетчик к выходу (лучше всего использовать локальный файл).
Счетчик необходим, потому что порядок фактических событий не всегда совпадает с порядком записи в файл. Назовите потоки или используйте значение ID в выходных данных. Я использую MS Excel, чтобы открыть файл и раскрасить все строки в зависимости от потока, так я очень четко вижу операции чередования.
Я даже написал оболочку для блокировки {}, какие инструменты при каждой блокировке включаются / выключаются.
Проблемы с синхронизацией ужасны для t-shot, поэтому я советую не тратить больше, чем потребовалось бы на рефакторинг. Иногда это указывает на то, что подход, который вы используете, является неоптимальным.
Не забудьте использовать volatile в случае необходимости с IO.