【发布时间】:2012-07-08 13:31:05
【问题描述】:
我定义了以下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() 方法在我保存在我的字典中的 same 实例上被调用,因为 _Disposed 变为 true 对于 saved对象,即_Dict[sessionId]._Disposed变成true!
我的服务的服务行为设置为:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
【问题讨论】:
-
您确定在您创建的 same 实例上调用了 Dispose(..) 吗?我的意思是,可能创建了该类的另一个实例,并且在 那个 上调用了 Dispose(..)。检查你得到 Dispose(..) 的实例的 hashcode...
-
@Tigran:我更新了我的问题:“我已经验证了 Dispose() 方法是在我保存在字典中的同一个实例上调用的,因为 _Disposed 对于保存的对象。”
标签: c# wcf idisposable datacontract