c# – 即使服务仍然引用,为什么Dispose被调用DataContract?

前端之家收集整理的这篇文章主要介绍了c# – 即使服务仍然引用,为什么Dispose被调用DataContract?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经定义了以下DataContract,它实现了IDisposable:
  1. [DataContract]
  2. public class RegularFileMetadata : FileMetadataBase,IDisposable
  3. {
  4. bool _Disposed = false; //note this!
  5.  
  6. //...
  7.  
  8. protected virtual void Dispose(bool disposing)
  9. {
  10. if (!_Disposed)
  11. {
  12. //...
  13. _Disposed = true; //note this too!
  14. }
  15. }
  16. public void Dispose()
  17. {
  18. Dispose(true);
  19. GC.SuppressFinalize(this);
  20. }
  21. }

并且我将调用以下服务方法传递上述数据合同的一个实例:

  1. [OperationContract]
  2. [ServiceKnownType(typeof(RegularFileMetadata))]
  3. Guid BeginUpload(FileMetadataBase Metadata);

在BeginUpload的实现中,我简单地将字典中的元数据保存为:

  1. Dictionary<Guid,RegularFileMetadata> _Dict;
  2.  
  3. public Guid BeginUpload(FileMetadataBase fileMetadata)
  4. {
  5. //...
  6. var Metadata = fileMetadata as RegularFileMetadata;
  7. Guid sessionId = Guid.NewGuid();
  8. _Dict.Add(sessionId,Metadata); //Metadata SAVED!
  9. return sessionId ;
  10. }

我的问题是,从这个方法返回之后,即使我已经将实例保存在字典_Dict中,为什么要调用Dispose()?

我已经验证了在我保存在我的字典中的同一个实例上调用了Dispose()方法,因为_Disposed对于保存的对象变为true,即_Dict [sessionId].

我的服务的服务行为设置为:

  1. [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:

  1. [OperationBehavior(AutoDisposeParameters=false)]
  2. public Guid BeginUpload(FileMetadataBase fileMetadata)
  3. {
  4. //...
  5. var Metadata =

猜你在找的C#相关文章