2010-02-19 1 views
4

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

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

ответ

1

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

, чтобы обойти эти проблемы, рекомендуется использовать все каналы канала IPC в дочернем приложении AppDomain. затем, когда вы хотите закрыть его, вы просто выполняете обычные «прекрасные» процедуры закрытия функции close(), а затем AppDomain Unload. это приведет к тому, что любые ядерные удары исчезнут.

он удалит любые материалы, связанные с IPC, а также ударит клиента в голове для забивания канала IPC;)