2014-07-11 58 views
2

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

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

回答

4

Sitecore事件是同步执行的。 Sitecore Marketplace上有一个Sitecore Development Toolkit模块,它包含一个异步触发事件的代码,您可以在您的解决方案 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 
} 
+0

如果你看看他们的DoAsync()的实现,他们只需调用.BeginInvoke,技术上它将在另一个线程上运行任务,但Sitecore确实有启动后台作业的机制。 – ddysart

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。