加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用客户端激活的对象在app域中远程处理静态对象的生命周

发布时间:2020-12-15 08:15:21 所属栏目:百科 来源:网络整理
导读:我对AppDomain中的共享/静态对象生存期很好奇,其中RemotingCalls是创建共享对象的原因. 我们正在使用Remoting设置,它使用客户端激活的对象,我们只使用这些功能进入服务器.远程对象设置为单例. 服务器设置通道并使用RemotingConfiguration.Configure加载配置
我对AppDomain中的共享/静态对象生存期很好奇,其中RemotingCalls是创建共享对象的原因.

我们正在使用Remoting设置,它使用客户端激活的对象,我们只使用这些功能进入服务器.远程对象设置为单例.

服务器设置通道并使用RemotingConfiguration.Configure加载配置文件.

其中一些服务器功能触摸并使用服务器上的一些静态(在vb.net中共享)变量.我无法找出这些静态变量的生命周期,它们是在第一次触摸时创建的(静态构造函数运行).使用日志记录我无法看到对象dispose / finalize发生.

连接到远程服务器后等待几分钟,看到共享对象活得很好.

问题:

那么这个远程处理设置中静态对象的预期实时时间是多少.它们是否与AppDomain一样长,或者当Remoting对象被交换时它们会被循环使用.如果需要,延长寿命的正确方法是什么?

答案:

静态类型存在于AppDomain中,因为它们是第一次访问,直到AppDomain被卸载.因此,只要AppDomain正在运行,您就不需要延长其生命周期.

解决方法

静态字段永远不会被垃圾收集.看看 Jeffrey Richter’s article.
静态字段被垃圾收集器视为根,因此垃圾收集器将始终假定使用静态字段.

加载所有者类型时会初始化静态字段. JIT编译器在需要构建方法时加载类型,并看到对此类型的引用.加载后,类型将保留所有AppDomain生命周期,因此属于该类型的字段(静态字段)引用的任何内容都将被视为已使用的引用,并且不会被垃圾回收.

另外,关于这个声明:

I can’t find out what the lifetime of
these static variables is,they get
created (static constructor is run)
when they’re touched for the first
time.

技术上静态变量不一定在静态构造函数中第一次“触及”.考虑这样的类:

public static class Test
{
    private static MyType myType;

    static Test()
    {
        myType = new MyType();
    }
}

除非您拥有正在执行并引用此类型的代码,例如var x = Test.myType;,否则不会调用静态构造函数(类型构造函数).嗯,这可能取决于“触及”究竟意味着什么.

答案:

静态类型存在于AppDomain中,您就不需要延长其生命周期.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读