什么编程实践导致Tridion报告一个会话在另一个线程上使用?

什么编程实践导致Tridion报告一个会话在另一个线程上使用?,tridion,Tridion,在我的Tridion内容管理服务器上检查事件日志时(我使用的是2009版本),我看到警告说: Session is used on another thread... than it was created on ... Session objects are not thread safe. 哪些编程/模板化实践可能导致这种情况 编辑:到目前为止,我们有一些好的建议: 不要将会话对象存储在静态变量中(Chris) 不要将发动机或机组存储在静态变量中(Miguel) 事实上,这两种模式都是可

在我的Tridion内容管理服务器上检查事件日志时(我使用的是2009版本),我看到警告说:

Session is used on another thread... than it was created on ... 
Session objects are not thread safe.
哪些编程/模板化实践可能导致这种情况

编辑:到目前为止,我们有一些好的建议:

  • 不要将会话对象存储在静态变量中(Chris)
  • 不要将发动机或机组存储在静态变量中(Miguel)

  • 事实上,这两种模式都是可靠的,您应该检查自己的代码中是否有这些反模式。(引擎有一个对会话的引用,这是有意义的。)不过,我已经搜索了导致问题的代码库,但没有找到任何一个。那么,有没有人有更多的想法?我还欢迎您就如何调试这类东西提出建议,或者缩小问题代码的范围。

    我发现,如果您将会话对象存储在模板中的静态变量中,则会发生此错误。它在调试模式下可以正常工作,但一旦我运行多线程发布服务器(即多个渲染线程),这个问题就会出现。

    我还想根据以前的经验添加一条注释。 以下场景:

    • 会话和/或引擎和/或包存储在静态变量中
    • 会话和/或引擎和/或包作为参数发送给静态方法
    除上述问题外,还可能导致多个问题,包括发布期间的内存泄漏

    Publisher将开始消耗内存,直到最后进入无响应模式(您无法停止、重新启动或禁用),并且您需要重新启动服务器

    在进行大规模出版时,这些问题可能会变得越来越糟糕

    因此,建议将使用会话、引擎和包的任何内容都转换为非静态

    例如,从以下用于初始化跨所有模板使用的实用程序的代码开始

    使用系统;
    使用System.Collections.Generic;
    使用系统文本;
    使用System.Text.RegularExpressions;
    使用System.Xml;
    使用Tridion;
    使用Tridion.ContentManager;
    使用Tridion.ContentManager.CommunicationManagement;
    使用Tridion.ContentManager.ContentManagement;
    使用Tridion.ContentManager.ContentManagement.Fields;
    使用Tridion.ContentManager.Templating;
    使用Tridion.ContentManager.Publishing;
    命名空间sample.sample1
    {
    公用事业
    {
    专用静态引擎(u引擎),;
    私有静态包_包;
    公共无效初始化(引擎e,包p)
    {
    _发动机=e;
    _包装=p;
    }
    }
    }
    
    进入

    使用系统;
    使用System.Collections.Generic;
    使用系统文本;
    使用System.Text.RegularExpressions;
    使用System.Xml;
    使用Tridion;
    使用Tridion.ContentManager;
    使用Tridion.ContentManager.CommunicationManagement;
    使用Tridion.ContentManager.ContentManagement;
    使用Tridion.ContentManager.ContentManagement.Fields;
    使用Tridion.ContentManager.Templating;
    使用Tridion.ContentManager.Publishing;
    命名空间sample.sample1
    {
    公用事业
    {
    私人发动机(u发动机),;
    私人套餐(u套餐),;
    公共无效初始化(引擎e,包p)
    {
    _发动机=e;
    _包装=p;
    }
    }
    }
    

    可以保存很多问题

    问题不仅出现在存储会话时,而且出现在存储任何TOM.NET对象(
    组件
    页面
    等)时。每个这样的对象都有一个对会话的内部引用,该会话是通过对该对象的任何访问创建的,可能必须返回到会话才能从Tridion检索请求的信息

    尽管大多数项类型的“本机”属性似乎都是在实例上检索和保留的,但是像
    LoadApplicationData
    这样的调用可能(必须)返回到会话以访问请求的数据。如果这个调用发生在另一个线程上,您将收到您提到的警告消息


    我已经开始查看我怀疑保留的每个TOM.NET对象,并预加载了很多数据,这些数据可能是我以后首次从其会话加载对象时需要的。

    另一种情况是,如果您的事件系统、模板或工作流代码启动子线程,并在没有适当锁定的情况下将会话或引擎对象传递给它们地点


    基本上,引擎和会话对象所基于的单线程公寓模型之外的任何内容:

    我在模板生成器中预览内容时看到了这种情况。将会话存储在静态变量中会一直给您带来麻烦,而这正是这条消息要提醒您的。这是一个很好的答案,但我刚刚在代码中查找了它,但没有找到它。所以我仍然在寻找其他可能导致它的做法。我接受了这一点,因为我觉得它确实为这个问题带来了新的信息。但对其他回答者没有不尊重。谢谢各位