Подтвердить что ты не робот

Почему моя служба Windows запускает экземпляры csc.exe?

Я написал многопоточную службу Windows на С#. По какой-то причине csc.exe запускается каждый раз, когда поток генерируется. Я сомневаюсь, что это связано с потоками как таковыми, но тот факт, что он происходит по принципу потоковой передачи и что эти потоки недолговечны, делает проблему очень заметной: много процессов csc.exe постоянно запускается и останавливается.

Производительность по-прежнему очень хорошая, но я ожидаю, что это улучшится, если я смогу это устранить. Тем не менее, меня еще больше беспокоит то, что McAfee пытается отсканировать экземпляры csc.exe и в конечном итоге убивает службу, по-видимому, когда один экземпляр выходит в середине сканирования. Мне нужно развернуть эту услугу коммерчески, поэтому изменение настроек McAfee не является решением.

Я предполагаю, что что-то в моем коде запускает динамическую компиляцию, но я не уверен, что. Кто-нибудь еще сталкивается с этой проблемой? Любые идеи для его решения?

Обновление 1:

После дальнейших исследований, основанных на предположении и ссылках из @sixlettervariables, проблема, похоже, связана с реализацией сериализации XML, как указано в Документация Microsoft на XmlSerializer:

Чтобы повысить производительность, инфраструктура XML-сериализации динамически генерирует сборки для сериализации и десериализации определенных типов.

Microsoft отмечает оптимизацию в том же документе:

Инфраструктура находит и повторно использует эти сборки. Это происходит только при использовании следующих конструкторов:

XmlSerializer.XmlSerializer(тип)

XmlSerializer.XmlSerializer(Тип, Строка)

который, как представляется, указывает на то, что codegen и компиляция будут выполняться только один раз при первом использовании, если используется один из двух указанных конструкторов. Тем не менее, я не пользуюсь этой оптимизацией, потому что я использую другую форму конструктора, в частности:

public XmlSerializer (Тип типа, Тип [] extraTypes)

Читая немного дальше, выясняется, что это также является вероятным объяснением утечки памяти, которое я наблюдал при выполнении моего кода. Опять же, из того же документа:

Если вы используете любой из других конструкторов, генерируются и не разгружаются несколько версий одной и той же сборки, что приводит к утечке памяти и низкой производительности. Самое простое решение - использовать один из ранее упомянутых двух конструкторов. В противном случае вы должны кэшировать сборки в Hashtable.

Два обходных решения, которые Microsoft предлагает выше, являются для меня последним средством. Переход к другой форме конструктора не является предпочтительным (я использую форму "extratypes" для сериализации производных классов, которая поддерживается в документах Microsoft), и я не уверен, что мне нравится идея управления кешем сборки для использования в нескольких потоках.

Итак, у меня sgen 'd, и см. итоговую сборку сериализаторов для моих типов, созданных как ожидалось, но когда мой код выполняет сборка сгенерирована не загружена (за наблюдение в средстве просмотра журнала слияния и мониторинг процесса). В настоящее время я изучаю, почему это так.

Обновление 2:

Сборка sgen'd загружается отлично, когда я использую один из двух "более дружественных" конструкторов XmlSerializer (см. обновление 1, выше). Когда я использую XmlSerializer(Type), например, загружается сборка sgen'd и не выполняется компиляция/компиляция во время выполнения. Однако, когда я использую XmlSerializer(Type, Type[]), сборка не загружается. Невозможно найти разумное объяснение этого.

Поэтому я возвращаюсь к использованию одного из поддерживаемых конструкторов и sgen'ing. Эта комбинация устраняет мою оригинальную проблему (запуск csc.exe) плюс еще одну связанную с этим проблему (утечка памяти, вызванная XmlSerializer, упомянутая в обновлении 1 выше). Это означает, однако, что я должен вернуться к менее оптимальной форме сериализации для производных типов (использование XmlInclude в базовом типе) до тех пор, пока что-то не изменится в структуре для решения этой ситуации.

4b9b3361

Ответ 1

Психическая отладка:

Если это так, вы можете собрать эти сборки XML-сериализаторов априори.