我目前正在运行Tridion 2011 SP1.
我正在编写一些在发布页面时运行的代码.它遍历页面中的每个组件模板,获取组件并将各种字段写出到XML文档.对于具有许多组件模板的页面或具有许多字段的组件,此过程可能需要一段时间才能运行.如果进程超过30秒,我会收到错误消息
The operation performed by thread "EventSystem0" timed out.
Component: Tridion.ContentManager
Errorcode: 0
User: NT AUTHORITY\NETWORK SERVICE
Run Code Online (Sandbox Code Playgroud)
接着是另一个
Thread was being aborted.
Component: Tridion.ContentManager
Errorcode: 0
User: NT AUTHORITY\NETWORK SERVICE
StackTrace Information Details:
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at Tridion.ContentManager.Extensibility.EventSubscription.DeliverEvent(IEnumerable`1 subjects, TcmEventArgs eventArgs, EventPhases phase)
Run Code Online (Sandbox Code Playgroud)
我相信我有三个选择.
1.增加超时
这似乎是一个懒惰的解决方案,只隐藏了这个问题.无法保证超时问题不会再次发生.我也不确定超时值的存储位置(我尝试在Tridion Content Manager.msc管理单元中更改一些值,但没有运气).
2.在实际的事件处理程序例程中做得少,并且有一个单独的进程完成所有艰苦的工作
这似乎也不是正确的解决方案.我真的想将所有事件处理程序代码保存在一个地方.对于我们的5.3安装,我们有一个这样的解决方案,这是一个维护的噩梦(这是一个非常古老和写得不好).
3.让我的代码更有效率
我的组件有很多字段,如果它们是ComponentLinks,我的代码必须深入研究每个字段.我想因为Tridion对象的属性是延迟加载的,所以我访问的每个属性都会调用API /数据库.检索在访问多个属性时很快堆积的属性平均需要0.2秒.如果有一种方法可以在一次调用中检索所有属性,那么这将非常有用.
有任何想法吗?
tridion ×1