Я использую ThreadPool.UnsafeRegisterWaitForSingleObject
(далее RWFSO) для асинхронного ожидания на Semaphore
.Он возвращает мне RegisteredWaitHandle
, что я не могу легко Unregister()
.Мне нужно отменить их регистрацию, потому что дескриптор хранит ссылку на делегат и его объект состояния, а мой процесс пропускает память с каждым дескриптором.В конце концов они завершаются, но это занимает слишком много времени и оказывает слишком большое давление на сборщик мусора, что приводит к увеличению использования личной памяти моего процесса в диапазоне 1,8 ГБ.Я делаю много асинхронных запросов.
Семафор используется для доступа к асинхронной реализации HttpWebRequest
: BeginGetRequestStream
и BeginGetResponse
.Если я не использую семафор, он продолжает говорить мне «недостаточно свободных потоков в пуле потоков» из-за идиотского способа его реализации.Если я использую блокирующие примитивы, такие как semaphore.WaitOne()
, тогда мой пул потоков будет в конечном итоге заблокирован, и ничего не произойдет.
RWFSO возвращает RegisteredWaitHandle
, но это бесполезно для моего вызывающего потока, так как мне нужно Unregister()
этот дескриптор только тогда, когда ожидание завершено;У меня нет сценария отмены.Я не могу просто передать экземпляр RegisteredWaitHandle
своему делегату (через внешнее поле, установленное для объекта состояния, переданного делегату), потому что делегат может быть завершен в другом потоке до того, как управление даже вернется из RWFSO.
Как мне безопасно и быстро Unregister()
a RegisteredWaitHandle
с, когда и только когда его ожидание завершено?