我想挂钩项目:重命名事件做一些处理。可能需要几分钟的时间。事件处理程序是否与正常的管道执行异步或同步执行?如果我自己需要这样做,是否有标准的Sitecore方法可以异步启动它?是否同步处理Sitecore事件?
此处理程序需要执行的唯一时间是在内容编辑器中重命名项目时。
我想挂钩项目:重命名事件做一些处理。可能需要几分钟的时间。事件处理程序是否与正常的管道执行异步或同步执行?如果我自己需要这样做,是否有标准的Sitecore方法可以异步启动它?是否同步处理Sitecore事件?
此处理程序需要执行的唯一时间是在内容编辑器中重命名项目时。
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
}
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。
如果你看看他们的DoAsync()的实现,他们只需调用.BeginInvoke,技术上它将在另一个线程上运行任务,但Sitecore确实有启动后台作业的机制。 – ddysart