Шаг, следующий за установлением соединения с анонимным каналом, требует вызова сервера DisposeLocalCopyOfClientHandle
. MSDN объясняет:Необходимость вызова DisposeLocalCopyOfClientHandle() после установления соединения
Метод DisposeLocalCopyOfClientHandle должен быть вызван после того, как клиент ручка была передана клиенту. Если этот метод не вызван , объект AnonymousPipeServerStream не получит уведомление , когда клиент располагает своим объектом PipeStream.
Пытаясь понять, почему не сервер будет заметить, когда клиент закрыт, я пошел на смотреть на DisposeLocalCopyOfClientHandle
на справочный источник:
// This method is an annoying one but it has to exist at least until we make passing handles between
// processes first class. We need this because once the child handle is inherited, the OS considers
// the parent and child's handles to be different. Therefore, if a child closes its handle, our
// Read/Write methods won't throw because the OS will think that there is still a child handle around
// that can still Write/Read to/from the other end of the pipe.
//
// Ideally, we would want the Process class to close this handle after it has been inherited. See
// the pipe spec future features section for more information.
//
// Right now, this is the best signal to set the anonymous pipe as connected; if this is called, we
// know the client has been passed the handle and so the connection is live.
[System.Security.SecurityCritical]
public void DisposeLocalCopyOfClientHandle() {
if (m_clientHandle != null && !m_clientHandle.IsClosed) {
m_clientHandle.Dispose();
}
}
Это предложение меня смутило:
once the child handle is inherited, the OS considers the parent and child's handles to be different.
Не являются ручкой родителя и ручкой ребенка (то есть, m_handle
и t он серверm_clientHandle
, который передается ребенку) отличается от первого места? «разные» здесь означают «ссылки на разные объекты» (так я понимаю) или имеет другое значение?