Sitecore事件是否同步处理?

时间:2014-07-11 08:21:45

标签: sitecore sitecore6

我想挂钩项目:重命名事件进行一些处理。可能需要几分钟。事件处理程序是否与正常的管道执行异步或同步执行?如果我自己需要这样做,是否有一种标准的Sitecore方式可以异步启动它?

此处理程序需要执行的唯一时间是在内容编辑器中重命名项目时。

2 个答案:

答案 0 :(得分:4)

Sitecore个事件同步执行。 Sitecore Development Toolkit上有一个Sitecore Marketplace模块,其中包含用于异步触发事件的代码,您可以在解决方案 Sitecore Development Toolkit中轻松重复使用该代码。

这是他们的代码的一部分,它在触发事件时异步触发方法:

public void OnItemRenamed(object sender, EventArgs args)
{
  if (args != null)
  {
    var item = Event.ExtractParameter(args, 0) as Item;
    Assert.IsNotNull(item, "No item in parameters");

    var name = Event.ExtractParameter(args, 1) as string;
    Assert.IsNotNullOrEmpty(name, "No name in parameters");

    DoAsync(() => OnItemRenameAsync(item, name));
  }
}

private void OnItemRenameAsync(Item item, string name)
{
  var itemRef = new ItemReference(item.Parent);
  var itemRefText = itemRef.ToString();
  // do some work here
}

答案 1 :(得分:3)

Sitecore事件是同步的。你可以把你的长期任务作为工作开始。首先创建一个类来处理事件:

namespace MyNamespace
{
    public class MyClass
    {
        public void ItemRenamed (object sender, EventArgs args)
        {
            Run("LongRenameTask");
        }

        protected void Run(string methodName, EventArgs args)
        {
            var item = Event.ExtractParameter(args, 0) as Item;
            var name = Event.ExtractParameter(args, 1) as string;
            RunJob(methodName, item, name);
        }

        protected Handle RunJob(string methodName, Item item, string name)
        {
            var options = new JobOptions(
                "Preparing rename job '{0}' for '{1}'".FormatWith(
                    methodName, 
                    item.ID.ToString()), 
                "item:renamed", 
                "shell", 
                new ItemRenamedManager(item, name), 
                methodName)
                    {
                        WriteToLog = true,
                        AtomicExecution = true,
                    };

            var job = new Job(options);
            JobManager.Start(job);

            return job.Handle;
        }

    }
}    

然后创建一个类来完成你的工作(这将由Sitecore在后台线程上调用):

namespace MyNamespace
{
    public class ItemRenamedManager
    {
        protected Item RenamedItem { get; set; }
        protected string Name { get; set; }

        public ItemRenamedManager(Item item, string name)
        {
            RenamedItem = item;
            Name = name;
        }

        public void LongRenameTask()
        {
            // Do your long running task here. 
            // The property 'RenamedItem' will give you the item
        }
    }
}

然后在以下地址修补您的事件处理程序:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <events>
            <event name="item:renamed">
              <handler type="MyNamespace.MyClass" method="ItemRenamed" />
            </event>
        </events>
     </sitecore>
</configuration>

上面的代码有点内存并且需要一些错误处理,但应该非常接近,但这样,长时间运行的任务不会阻止内容编辑器UI。