Вам удалось закрыть компонент, сообщив, что вы что-то делаете не так.Однако вы на самом деле не решили проблему.STA, однопотоковая квартира, требуется для компонентов, которые не поддерживают многопоточность.Так что все его методы вызываются из одного и того же потока , даже если вызов был сделан в другом потоке.COM заботится о перенаправлении вызова из одного потока в другой.Поток STA делает это возможным путем прокачки цикла сообщений.
Однако вы создали другой поток и выполняете в нем вызовы, отличные от потока, в котором генератор объект создан.Это не решает проблему, это все еще потокобезопасно.COM по-прежнему выполняет маршал вызова.
Большое значение имеет поток, в котором вы создали объект generator .Поскольку это многопоточный объект, его необходимо создать в потоке STA.Обычно в приложении Windows есть только один, основной поток вашей программы, иначе известный как поток пользовательского интерфейса.Если вы создадите его в рабочем потоке .NET, который не является STA, как вы делаете здесь, тогда COM вступит в действие и создаст сам поток STA, чтобы предоставить компоненту гостеприимный дом.Это хорошо, но обычно нежелательно.
Здесь нет бесплатного обеда, вы не можете волшебным образом создать кусок кода, который явно говорит, что не поддерживает (ключ ThreadingModel в реестре) поддержку потоковвести себя так, как он.Ваша следующая лучшая ставка - создать поток STA и запустить все кода на нем, включая создание COM-объекта.Остерегайтесь того, что вам обычно приходится закачивать цикл обработки сообщений с помощью Application.Run (), многие COM-серверы предполагают, что он доступен.Особенно, когда они говорят вам, что требуется поток STA.Вы заметите, что они делают, когда они ведут себя неправильно, блокируют вызов метода или не вызывают события.
Что касается вашего исходного вопроса, это стандартное поведение .NET.Сборщик мусора запускается тогда, когда это необходимо, а не тогда, когда вы думаете, что должны.Вы можете переопределить его с помощью GC.Collect (), но это очень редко необходимо.Хотя это может быть быстрым решением в вашем случае, COM создает новый поток для каждого отдельного файла.Нить STA, чтобы дать генератору дом.Используйте Debug + Windows + Threads, чтобы увидеть их.Эти потоки не остановятся, пока COM-объект не будет уничтожен.Что требует запуска потока финализатора.Ваш код также будет использовать всю доступную память и бомбу с OOM, когда существует более двух тысяч файлов, что, возможно, является достаточной причиной для поиска реального исправления.