gpt4 book ai didi

Tridion - 事件系统对象没有被销毁

转载 作者:行者123 更新时间:2023-12-02 11:38:53 25 4
gpt4 key购买 nike

我创建了一个名为 WorkflowEventSystemTcmExtension,它有一个订阅 FinishProcess 事件的事件处理程序。此事件的目的是安排发布关联工作流主题的所有依赖项(即页面)。

我遇到的问题是,即使事件在正确的时间触发(工作流程完成),并且所有应该安排发布的项目都是 PublishScheduler事件创建的对象似乎永远不会超出范围,因此 WorkflowEventSystem 对象也不会超出范围。

关于事件系统的工作方式,我是否遗漏了一些会导致这些对象永远存在的东西?我在下面包含了我认为相关的代码(总结了一些部分)。感谢您的帮助。

以下是实际 TcmExtension 的大部分内容:

public class WorkflowEventSystem : TcmExtension
{
public WorkflowEventSystem()
{
this.Subscribe();
}

public void Subscribe()
{
EventSystem.Subscribe<ProcessInstance, FinishProcessEventArgs>(ScheduleForPublish, EventPhases.All);
}
}

ScheduleForPublish 创建一个 PublishScheduler 对象(我创建的类):

private void ScheduleForPublish(ProcessInstance process, FinishProcessEventArgs e, EventPhases phase)
{
if(phase == EventPhases.TransactionCommitted)
{
PublishScheduler publishScheduler = new PublishScheduler(process);
publishScheduler.ScheduleForPublish(process);
publishScheduler = null; // worth a try
}
}

ScheduleForPublish 方法看起来与此类似:

public void ScheduleForPublish(ProcessInstance process)
{
using(Session session = new Session("ImpersonationUser"))
{
var publishInstruction = new PublishInstruction(session);
// Set up some publish Instructions

var publicationTargets = new List<PublicationTarget>();
// Add a PublicationTarget here by tcm id

IList<VersionedItem> itemsToPublish = new List<VersionedItem>();
// Add the items we want to publish by calling GetUsingItems(filter)
// on the workflow process' subject

//Publish the items
PublishEngine.Publish(itemsToPublish.Cast<IdentifiableObject>(), publishInstruction, publishTargets);
}
}

最佳答案

TcmExtension 类的生命周期管理非常简单:

  1. 当您调用 Subscribe 时,您指定的 TcmExtension 对象将添加到内部订阅列表中

  2. 当您稍后调用取消订阅时,相同的TcmExtension对象将从订阅列表中删除

由于您从未调用Unsubscribe,因此您的WorkflowEventSystem 永远不会被删除,因此永远不会被.NET 进行垃圾收集。由于您的 WorkflowEventSystem 保存了对其创建的 PublishScheduler 实例的引用,因此该实例也永远不会被清理。

自定义 TcmExtension 的正确样板是:

public class WorkflowEventSystem : TcmExtension, IDisposable
{
EventSubscription _subscription;

public WorkflowEventSystem()
{
this.Subscribe();
}

public void Subscribe()
{
_subscription = EventSystem.Subscribe<ProcessInstance,
FinishProcessEventArgs>(ScheduleForPublish, EventPhases.All);
}

public void Dispose()
{
_subscription.Unsubscribe();
}
}

Nuno 在本文中还给出了一个更长的示例(处理多个订阅者): http://nunolinhares.blogspot.nl/2012/07/validating-content-on-save-part-1-of.html

关于Tridion - 事件系统对象没有被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com