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

我已经定义了以下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 =

相关文章

C#项目进行IIS部署过程中报错及其一般解决方案_c#iis执行语句...
微信扫码登录PC端网站应用的案例(C#)_c# 微信扫码登录
原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...