我已经定义了以下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 ;
}
我的问题是,在从此方法返回后,即使我已将实例保存在字典Dispose()
中,为什么会调用_Dict
?
我已经确认在我已保存在字典中的相同实例上调用了Dispose()
方法,因为{em} _Disposed
变为true
>已保存对象,即_Dict[sessionId]._Disposed
变为true
!
我的服务的服务行为设置为:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
答案 0 :(得分:15)
它被处置因为该对象“属于”WCF - 它凭空创建了对象实例,作为参数传递给您的方法。而且,它足以观察到这个对象实现了IDisposable
,所以它会在你的方法完成后处理它。
如果您希望在方法完成后挂起此对象的实例,则需要自己创建此类实例,将相关详细信息从一个实例复制到另一个实例。
为什么
中Dispose()
被调用,即使我已将实例保存在字典_Dict
因为Dispose
模式与没有与引用和垃圾回收有关。重要的是,每当在多个方法/参与者/代理之间传递对一次性对象的引用时,就“谁”负责调用Dispose
以及何时进行协议。在这种情况下,“谁”是WCF基础设施。
更正 - 您可以通过向方法添加OperationBehavior
属性并将AutoDisposeParameters
设置为false来更改此行为:
[OperationBehavior(AutoDisposeParameters=false)]
public Guid BeginUpload(FileMetadataBase fileMetadata)
{
//...
var metadata =