什么编程实践导致Tridion报告一个会话在另一个线程上使用?
在我的Tridion内容管理服务器上检查事件日志时(我使用的是2009版本),我看到警告说:什么编程实践导致Tridion报告一个会话在另一个线程上使用?,tridion,Tridion,在我的Tridion内容管理服务器上检查事件日志时(我使用的是2009版本),我看到警告说: Session is used on another thread... than it was created on ... Session objects are not thread safe. 哪些编程/模板化实践可能导致这种情况 编辑:到目前为止,我们有一些好的建议: 不要将会话对象存储在静态变量中(Chris) 不要将发动机或机组存储在静态变量中(Miguel) 事实上,这两种模式都是可
Session is used on another thread... than it was created on ...
Session objects are not thread safe.
哪些编程/模板化实践可能导致这种情况
编辑:到目前为止,我们有一些好的建议:
事实上,这两种模式都是可靠的,您应该检查自己的代码中是否有这些反模式。(引擎有一个对会话的引用,这是有意义的。)不过,我已经搜索了导致问题的代码库,但没有找到任何一个。那么,有没有人有更多的想法?我还欢迎您就如何调试这类东西提出建议,或者缩小问题代码的范围。我发现,如果您将会话对象存储在模板中的静态变量中,则会发生此错误。它在调试模式下可以正常工作,但一旦我运行多线程发布服务器(即多个渲染线程),这个问题就会出现。我还想根据以前的经验添加一条注释。 以下场景:
- 会话和/或引擎和/或包存储在静态变量中
- 会话和/或引擎和/或包作为参数发送给静态方法
使用系统;
使用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对象,并预加载了很多数据,这些数据可能是我以后首次从其会话加载对象时需要的。另一种情况是,如果您的事件系统、模板或工作流代码启动子线程,并在没有适当锁定的情况下将会话或引擎对象传递给它们地点
基本上,引擎和会话对象所基于的单线程公寓模型之外的任何内容:我在模板生成器中预览内容时看到了这种情况。将会话存储在静态变量中会一直给您带来麻烦,而这正是这条消息要提醒您的。这是一个很好的答案,但我刚刚在代码中查找了它,但没有找到它。所以我仍然在寻找其他可能导致它的做法。我接受了这一点,因为我觉得它确实为这个问题带来了新的信息。但对其他回答者没有不尊重。谢谢各位