在反编译了一堆相关的类之后System.ServiceModel
,我能够得到更多的信息。
该Open
调用似乎沿着继承树向下到达 CommunicationObject,在该处调用其Open
方法。所有这一切似乎都是提供一堆诊断信息并引发一些事件。
该类ChannelFactory
使用 Open 事件做了很多事情,包括创建其内部通道工厂:
protected override void OnOpening()
{
base.OnOpening();
this.innerFactory = this.CreateFactory();
if (this.innerFactory == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString("InnerChannelFactoryWasNotSet")));
}
}
正如其他人在这里提到的那样,关闭事件也用于关闭所有底层通道(通过它的内部通道工厂):
protected override void OnClose(TimeSpan timeout)
{
TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
while (true)
{
IChannel channel;
lock (base.ThisLock)
{
if (this.channelsList.Count == 0)
{
break;
}
channel = this.channelsList[0];
}
channel.Close(timeoutHelper.RemainingTime());
}
}