DefaultCommunicationTimeouts 较之一般意义上的方法调用,通信操作往往需要花费较长的时间。对于一个通信对象来说,如果针对它的某个方法调用在一段较长的时间内还没有返回,我们不可能无条件地等待下去,所以超时处理对于通信对象来说显得尤为重要。 通信对象的很多方法调用都会设置一个超时时限。回顾一下ICommunicationObject接口用于开启通信对象的Open方法,我们会发现它具有两个重载,其中一个具有TimeSpan类型的timeout参数,另一个则没有。这里的timeout参数实际上代表Open方法执行的超时时限。如果Open操作执行的时间过长,一旦超过了设定的时限,便会抛出TimeoutException异常。 public interface ICommunicationObject { //其他成员 void Open(); void Open(TimeSpan timeout); } 读者可能会问,如果调用无参数的Open方法,是否意味着没有超时限制并会一直等待方法返回呢?答案是否定的。对于没有显式指定超时时限的方法调用有默认的超时时限。WCF为所有需要默认超时设置的通信对象定义了System.ServiceModel.IDefaultCommunicationTimeouts接口,定义在该接口中的4个XxxTimeout属性分别代表开启、关闭、发送和接收4大操作默认的超时时限。 public interface IDefaultCommunicationTimeouts { TimeSpan CloseTimeout { get; } TimeSpan OpenTimeout { get; } TimeSpan ReceiveTimeout { get; } TimeSpan SendTimeout { get; } } 包括Binding在内的很多绑定模型成员都实现了IDefaultCommunicationTimeouts接口,包括上面提到的信道管理器的基类ChannelManagerBase和信道的基类ChannelBase。