代码之家  ›  专栏  ›  技术社区  ›  jmservera

从客户端处理SingleCall对象时,Remoting通道对Dispose方法调用两次

  •  0
  • jmservera  · 技术社区  · 15 年前

    1. 来自同一应用程序域
    2. 使用tcp通道通过网络从远程客户端

    由于这些类中的一些用于这三种情况,我们有一些常用代码来对它们进行操作,例如:

    using(IRemoteObject remoteObject= (IRemoteObject) 
            RemotingHelper.GetObject(typeof(IRemoteObject)))
    {
       remoteObject.DoStuff();
    }
    

    RemotingHelper已经知道如何根据场景创建对象。这是英戈撞锤的一个修改。

    因此,在前两种情况下使用此代码时,代码的行为是正确的,但是当通过实际远程处理使用时,远程对象将被创建两次并被释放两次。

    这是因为Dispose()调用 使用 语句作为一个新的远程调用进行管理,但是远程处理基础结构已经被自动调用以释放对象,因为这就是它对SingleCall对象的行为:每个调用都创建一个新实例并自动释放它。

    是否有任何配置值来避免这些重复(冗余)调用?


    编辑:我已经知道为什么会这样了。对于远程SingleCall IDisposable对象,remoting通道在方法返回后自动调用Dispose,第二次调用由客户端生成的代理完成,导致服务器端实例化一个新对象,只用于调用Dispose方法。

    这第二个电话是我想避免的,因为它是不必要的。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Jim Mischel    15 年前

    仔细想想,我倾向于认为这是正确的行为。据我所知 SingleCall

    IRemoteObject remoteObject= (IRemoteObject) 
            RemotingHelper.GetObject(typeof(IRemoteObject));
    

    为客户端上的对象创建代理。如果我没记错的话,就没有和服务器联系。

    remoteObject.DoStuff();

    进行远程呼叫。服务器创建一个对象,执行方法,返回值(如果有的话),然后处理对象。

    那么,当你的电话 Dispose (或 using 语句),服务器再次执行:创建一个对象,调用 处置 方法,并销毁对象。

    这就是路 单调用 works:“当您将一个对象配置为SingleCall对象时,系统将为每个客户端方法调用创建一个新对象。” http://msdn.microsoft.com/en-us/library/aa719487(v=VS.71).aspx

    旧回应:

    我不知道有什么配置参数可以阻止这种行为。但是,如果您实现 as recommended ,您应该有一个标志,说明对象是否已被释放。这么叫 多次不应该是个问题。