我目前正在运行 Tridion 2011 SP1。
我正在编写一些在页面发布时运行的代码。它遍历页面中的每个组件模板,获取组件并将各种字段写入 XML 文档。对于具有许多组件模板或具有许多字段的组件的页面,此过程可能需要一段时间才能运行。如果该过程花费超过 30 秒,我会收到错误消息
The operation performed by thread "EventSystem0" timed out.
Component: Tridion.ContentManager
Errorcode: 0
User: NT AUTHORITY\NETWORK SERVICE
其次是另一个
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)
我相信我有三个选择。
1.增加超时
这似乎是一个懒惰的解决方案,只会隐藏问题。不能保证超时问题不会再次发生。我也不确定超时值存储在哪里(我尝试在 Tridion Content Manager.msc 管理单元中更改一些值,但没有运气)。
2. 在实际的事件处理程序例程中做的更少,并让一个单独的进程完成所有的艰苦工作
这似乎也不是正确的解决方案。我真的很想将我所有的事件处理程序代码保存在一个地方。我们为我们的 live 5.3 安装提供了这样的解决方案,维护起来简直就是一场噩梦(它非常陈旧而且写得不好)。
3. 让我的代码更高效
我的组件有很多字段,如果它们是 ComponentLinks,我的代码必须深入研究每个字段。我猜是因为 Tridion 对象的属性是延迟加载的,所以我访问的每个属性都会调用一次 API/数据库。检索一个属性平均需要 0.2 秒,该属性在访问多个属性时很快就会堆积起来。如果有一种方法可以在一次调用中检索所有属性,这将很有用。
有任何想法吗?