我想挂钩项目:重命名事件进行一些处理。可能需要几分钟。事件处理程序是否与正常的管道执行异步或同步执行?如果我自己需要这样做,是否有一种标准的Sitecore方式可以异步启动它?
此处理程序需要执行的唯一时间是在内容编辑器中重命名项目时。
答案 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。