Le comportement COM a du sens si vous y réfléchissez. Le code s'exécute dans le processus de service. Si vous marquez la classe à exécuter dans Single Threaded Apartment, un seul thread s'exécute à la fois. Les appels simultanés sont empilés dans le message qeueu s'exécutant un à la fois. Si un appartement multithread est spécifié, le code peut s'exécuter simultanément. Pour accomplir cela dans le processus en cours, plusieurs threads sont lancés pour obtenir ce comportement.
Si vous souhaitez éviter les problèmes de concurrence, vous devez placer votre classe dans une DLL. Ensuite, vous avez toujours plusieurs threads mais chacun s'exécute dans le processus d'appel, vous n'avez donc pas besoin de vous soucier de l'état.
Il n'existe aucun moyen d'exécuter un bloc de code simultanément sans threads. Même si vous exécutez des processus séparés, il existe encore plusieurs threads impliqués, ils sont simplement séparés par les limites du processus.
Je ne fais que souligner l'obviouse parce que j'ai déjà travaillé pour une entreprise qui ne pouvait tout simplement pas comprendre cela. :-) Ils pensaient pouvoir éviter les problèmes de threading en s'exécutant dans des processus séparés et en utilisant de la mémoire partagée (fichiers mappés en mémoire)! Cela a fonctionné (sorte de) quand leur code a couru sur un seul processeur et ils ont ajouté une application de «réparation» pour corriger les incohérences. Lors de la dernière installation, ils sont passés à plusieurs processeurs et tout s'est vraiment effondré. Puis je suis parti, la fin.