Srv_LoginChannelFactory.Close()
- это место, где оно находится. Когда вы звоните близко, вы отказываетесь от любого неуправляемого ресурса, который у вас был. Попытка сделать что-то иное, чем проверка его состояния или повторное открытие, приводит к исключению «Не удается получить доступ к удаленному объекту».
Это верно, когда вы закрываете одноразовый предмет и затем пытаетесь что-то с ним сделать. Например, запись в файл, который закрыт, или выполнение оператора sql для закрытого соединения с базой данных.
Для решения этой проблемы у вас есть три варианта.
Не делайте Srv_LoginChannelFactory полем. Вместо этого сделайте его локальным для нажатия кнопки. Если это единственное место, где вы его используете, это, вероятно, имеет смысл сделать, поскольку сокращает время использования неуправляемого ресурса.
Реализация IDisposable (вы должны делать это всякий раз, когда у вас есть поле Disposable), не закрывайте Srv_LoginChannelFactory, за исключением Login.Dispose.
Измените нажатие кнопки, чтобы проверить состояние Srv_LoginChannelFactory, прежде чем пытаться создать канал с ним. Вам все еще нужно реализовать IDisposable на случай, если нажатие кнопки не произойдет.
Примечание : EnsureOpened похоже, что его можно использовать для проверки состояния, но он работает только до его открытия. Как только он будет закрыт, он бросит.
Относительно того, что Close () совпадает с Dispose.
Из раздела «Настройка имени метода Dispose» в Реализация Finalize и Dispose для очистки неуправляемых ресурсов в Руководстве по проектированию для разработки библиотек классов
Иногда доменное имя
более подходящим, чем утилизировать. За
Например, инкапсуляция файлов может
хочу использовать имя метода Close. В
В этом случае внедрить утилизацию в частном порядке
и создать публичный метод Close, который
звонки утилизировать. Следующий код
Пример иллюстрирует эту модель. Вы
можно заменить Close именем метода
соответствует вашему домену. это
пример требует пространства имен System.
Идея в том, чтобы придать паритет методу Open. Лично я думаю, что это вызывает много путаницы, но я не могу придумать ничего лучшего (CloseAndDispose?)