2014-07-11 2 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 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를 차단하지 않습니다됩니다.

관련 문제