我已经定义了以下DataContract,它实现了IDisposable:
[DataContract] public class RegularFileMetadata : FileMetadataBase,IDisposable { bool _Disposed = false; //note this! //... protected virtual void Dispose(bool disposing) { if (!_Disposed) { //... _Disposed = true; //note this too! } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } }
[OperationContract] [ServiceKnownType(typeof(RegularFileMetadata))] Guid BeginUpload(FileMetadataBase Metadata);
在BeginUpload的实现中,我简单地将字典中的元数据保存为:
Dictionary<Guid,RegularFileMetadata> _Dict; public Guid BeginUpload(FileMetadataBase fileMetadata) { //... var Metadata = fileMetadata as RegularFileMetadata; Guid sessionId = Guid.NewGuid(); _Dict.Add(sessionId,Metadata); //Metadata SAVED! return sessionId ; }
我的问题是,从这个方法返回之后,即使我已经将实例保存在字典_Dict中,为什么要调用Dispose()?
我已经验证了在我保存在我的字典中的同一个实例上调用了Dispose()方法,因为_Disposed对于保存的对象变为true,即_Dict [sessionId].
我的服务的服务行为设置为:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
解决方法
它正在被处理,因为该对象“属于”WCF – 它创建了空虚的对象实例,作为参数传递给您的方法.而且,这个对象实现了IDisposable,所以一旦你的方法完成,它就会处理它.
如果您希望在方法完成后将此对象的实例挂起,那么您需要自己创建此类实例,将相关详细信息从一个实例复制到另一个实例.
why
Dispose()
is called even though I’ve saved the instance in the dictionary_Dict
因为Dispose模式与引用和垃圾收集无关.所有重要的是,每当提到一次性物品在多个方法/演员/代理之间传递时,就有一个关于“谁”负责调用Dispose和何时的协议.在这种情况下,“谁”是WCF基础架构.
更正 – 您可以通过将OperationBehavior
属性添加到方法来更改此行为,并将AutoDisposeParameters
设置为false:
[OperationBehavior(AutoDisposeParameters=false)] public Guid BeginUpload(FileMetadataBase fileMetadata) { //... var Metadata =