Tridion-事件系统对象未被销毁

Tridion-事件系统对象未被销毁,tridion,tridion-2011,Tridion,Tridion 2011,我已经创建了一个名为WorkflowEventSystem的TcmExtension,它有一个订阅了FinishProcess事件的事件处理程序。此事件的目的是计划发布关联工作流主题的所有依赖项(即页面) 我遇到的问题是,即使事件在正确的时间触发(工作流过程已完成),并且应该计划发布的所有项目都是,由事件创建的PublishScheduler对象似乎从未超出范围,因此WorkflowEventSystem对象也不会超出范围 事件系统是如何工作的,这会使这些对象永远存在下去,我有什么遗漏吗?我已经

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

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

事件系统是如何工作的,这会使这些对象永远存在下去,我有什么遗漏吗?我已经考虑了下面的相关代码(总结了一些部分)。谢谢你的帮助

以下是大部分实际的TcmExtension:

公共类WorkflowEventSystem:TcmExtension
{
公共WorkflowEventSystem()
{
这个。订阅();
}
公开无效订阅()
{
订阅(ScheduleForPublish、EventPhases.All);
}
}
ScheduleForPublish
创建一个
PublishScheduler
对象(已创建I类):

private void ScheduleForPublish(ProcessInstance进程、FinishProcessEventArgs e、EventPhases阶段)
{
if(阶段==EventPhases.TransactionCommitted)
{
PublishScheduler PublishScheduler=新的PublishScheduler(进程);
publishScheduler.ScheduleForPublish(进程);
publishScheduler=null;//值得一试
}
}
ScheduleForPublish
方法与此类似:

public void ScheduleForPublish(ProcessInstance进程)
{
使用(会话=新会话(“模拟用户”))
{
var publishInstruction=新publishInstruction(会话);
//设置一些发布说明
var publicationTargets=新列表();
//按tcm id在此处添加PublicationTarget
IList itemsToPublish=新列表();
//通过调用GetUsingItems(筛选器)添加要发布的项目
//论工作流过程的主题
//发布项目
PublishEngine.Publish(itemsToPublish.Cast(),publishInstruction,publishTargets);
}    
}

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

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

  • 稍后调用
    Unsubscribe
    时,将从订阅列表中删除相同的
    TcmExtension
    对象

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

    定制
    TcmExtension
    的合适样板是:

    公共类WorkflowEventSystem:TcmExtension,IDisposable
    {
    事件订阅(EventSubscription);;
    公共WorkflowEventSystem()
    {
    这个。订阅();
    }
    公开无效订阅()
    {
    _订阅=EventSystem.Subscribe(ScheduleForPublish,EventPhases.All);
    }
    公共空间处置()
    {
    _订阅。取消订阅();
    }
    }
    
    Nuno还在本文中给出了一个较长的示例(处理多个订户):

    你说PublishScheduler对象没有超出范围是什么意思?你怎么知道?@Quirijn PublishScheduler只是我创建的一个类,它从实际的TcmExtension中提取了大部分逻辑。它只包含ScheduleForPublish方法和一些助手类,您可以在我在这里包含的最后一个代码示例中看到它的内容。你怎么知道你有问题?症状是什么?您如何监控它?@DominicCronin很抱歉,一开始我误读了他的问题,我第一次注意到这一点是在实例集合在事件的不同事件中保留其值时(一开始我只在WorkflowEventSystem中拥有所有逻辑)。我通过在析构函数中为每个类放置一行代码来确认,以便在销毁时向事件日志写入一个条目。除非我关闭Tridion COM+服务,否则析构函数条目永远不会出现在事件日志中。每个类方法所做的最后一件事就是在事件日志中写入一个“Done”条目,这些条目确实会出现,它们似乎永远不会被销毁。此外,我假设这是相关的,但每当我启动COM+服务时,我都会在“Tridion Content Manager”事件日志中连续三次收到以下警告:事件200,内核:无法创建事件系统对象。Subscribe方法中“SUBSCRIBATION”之前是否缺少下划线?