항목을 연결하고 싶습니다. 일부 처리를 위해 이름이 바뀐 이벤트입니다. 하지만 몇 분 정도 걸릴 수 있습니다. 이벤트 처리기가 비동기 적으로 또는 일반 파이프 라인 실행과 동 기적으로 실행됩니까? 이 작업을 직접 수행해야하는 경우 비동기식으로 킥오프하는 표준 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 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
}
}
}
그런 다음에 이벤트 핸들러를 패치 :
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에 의해 백그라운드 스레드에서 호출됩니다) :
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<events>
<event name="item:renamed">
<handler type="MyNamespace.MyClass" method="ItemRenamed" />
</event>
</events>
</sitecore>
</configuration>
위의 코드는 메모리에서 조금 cribbed 일부 오류 처리를 필요로하지만, 아주 가까이해야하지만,이 방법은, 당신의 장기 실행 작업이 콘텐츠 편집기 UI를 차단하지 않습니다됩니다.
DoAsync()의 구현을 살펴보면 .BeginInvoke를 호출하기 때문에 기술적으로 다른 스레드에서 작업이 실행되지만 Sitecore에는 백그라운드 작업을 시작하는 메커니즘이 있습니다. – ddysart