Я изучаю возможность перезаписи относительно небольшой службы с С++ на С#. Услуга имеет две основные функции:
- Выполнять HTTP-запросы раз в то время. Они включают в себя несколько высокоуровневых задач, таких как кодирование/декодирование JSON, кодирование/декодирование base64 и сами запросы HTTP, для которых С++ не является удивительным;
- Выполняйте ряд задач, связанных с аудио, связанных с реальным временем, которые имеют жесткие сроки, для которых С# не является удивительным.
Задачи в реальном времени обрабатываются отдельной библиотекой, которая выполняет собственные потоковые работы и практически не взаимодействует с остальной частью службы. Остальная часть сервиса подает ему немного данных, полученных из HTTP-запросов, каждые 5 минут или около того.
Дело в том, что, поскольку часть в реальном времени имеет жесткие сроки, я не могу терпеть GC-паузы в потоках библиотеки. На моей собственной стороне кода должно быть достаточно времени для того, чтобы GC работал между веб-запросами, но я не могу терпеть, что он срабатывает, пока я пытаюсь передать данные в библиотеку.
I found, что я могу создать критический раздел, в котором сборщик мусора не начнет использовать GC.TryStartNoGCRegion()
, который разрешает половину проблемы.
Тем не менее, я до сих пор не знаю, есть ли способ сообщить .NET GC оставить только отдельные потоки, которые не запускают управляемый код. Возможно ли это?