Поведение COM имеет смысл, если вы об этом думаете. Код выполняется внутри сервисного процесса. Если вы отметите класс для запуска в Single Threaded Apartment, то одновременно будет выполняться только один поток. Параллельные вызовы суммируются в сообщении qeueu, которое выполняется по одному. Если указана многопоточная квартира, то код может выполняться одновременно. Для достижения этой цели в процессе работы несколько потоков запускаются для достижения этого поведения.
Если вы хотите избежать проблем с параллелизмом, вам нужно поместить свой класс в dll. Тогда у вас все еще есть несколько потоков, но каждый из них выполняется в вызывающем процессе, поэтому вам не нужно беспокоиться о состоянии.
Невозможно выполнить любой блок кода одновременно без потоков. Даже если вы выполняете в отдельных процессах, все еще задействовано несколько потоков, они просто разделены границей процесса.
Я только использую obviouse, потому что я когда-то работал в компании, которая просто не могла получить это через их головы. :-) Они думали, что могут избежать проблем с многопоточностью, выполняя отдельные процессы и используя общую память (файлы с отображением в памяти)! Это работало (вроде), когда их код работал на одном процессоре, и они добавили приложение «исправление», чтобы исправить несоответствия. При последней установке они перешли на несколько процессоров, и все действительно развалилось. Затем я ушел, конец.