.NET IpcChannel не надежно очищает должным образом? - PullRequest
4 голосов
/ 19 февраля 2010

По какой-то причине, после использования IpcChannel и его выключения, иногда именованная труба остается открытой с ожидающим потоком. Я не могу сделать это по требованию в среде отладки, но это происходит от 5 до 10 раз в день в нашей производственной среде. Плохой эффект, который это имеет, заключается в том, что он мешает мне выгрузить домен приложения, поскольку существует поток, бесконечно ожидающий в именованном канале (в нативном методе) ... в моем коде нет фрейма в стеке вызовов - это внутренний код. чистая нить. Если я запускаю проводник процессов и нахожу дескриптор именованного канала, который был оставлен открытым, и принудительно закрываю его, то все снова становится счастливым, домен приложения выгружается нормально. Возможно, я делаю что-то не так, поскольку я не очень много работал с IpcChannels .... мой код на стороне сервера находится здесь: http://pastebin.com/f6e2583b9, если кто-то хочет взглянуть ... это работает на полностью исправленном Server2003 / .NET 2.0.

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

1 Ответ

1 голос
/ 23 января 2011

да, я видел это раньше.Аналогичная вещь может произойти с IPC, когда у клиента все еще открыт канал IPC - сервер не сможет закрыть и снова открыть его, поскольку он уже используется клиентом.

Рекомендуемый способ - разместить канал ВСЕГО IPC-сервера в дочернем домене приложения.затем, когда вы хотите закрыть его, вы просто выполняете обычные «хорошие» процедуры закрытия close (), за которыми следует AppDomain Unload.это уничтожит все остатки.

удалит все, что связано с IPC, а также ударит клиента по голове за захват канала IPC;)

...