2010-02-03 5 views
1

나는 Prism EventAggregator와 그 'great'을보고 있었다. 나는 UI 스레드에 스레드를 올바르게 마샬링 할 수있는 능력이 가장 중요하다고 생각합니다.Prism EventAggregator를 스레딩 요구에 사용할 수 있습니까?

이 기능을 사용하여 모듈 개발자에게 BackgroundWorker와 비슷한 방식으로 스레드를 만드는 데 사용할 수있는 클래스를 제공 할 수 있는지 궁금합니다. 클래스의 인터페이스는 다소 유사 할 수 있습니다

public interface IMyTask 
{ 
    event DoWorkEventHandler DoWork; 
    event RunWorkerCompletedEventHandler RunWorkerCompleted; 
    void RunTaskAsync(object obj); 
} 

나는 더 나은 이해를 위해 backgroundworker와 비슷한 유형을 유지했습니다. 구현에서 나는 완료가 여기

public MyTask(IEventAggregator eventAggregator, bool isUICompletion) 
{ 
     if (eventAggregator == null) 
     { 
       throw new ArgumentNullException("eventAggregator"); 
      } 
      _eventAggregator = eventAggregator; 
      _eventAggregator.GetEvent<TaskStartEvent>().Subscribe(TaskStartHandler, ThreadOption.BackgroundThread, false, new Predicate<TaskStartEventPayload>(StartTokenFilter)); 
      if(isUICompletion) 
       _token = _eventAggregator.GetEvent<TaskCompleteEvent>().Subscribe(TaskCompleteHandler, ThreadOption.UIThread,true,new Predicate<TaskCompleteEventPayload>(CompleteTokenFilter)); 
      else 
       _token = _eventAggregator.GetEvent<TaskCompleteEvent>().Subscribe(TaskCompleteHandler, ThreadOption.BackgroundThread, true, new Predicate<TaskCompleteEventPayload>(CompleteTokenFilter)); 
     } 

으로 내가 필터 필터 함수가 반환에 등록하고 필요합니다 스레드 내가 걸릴 MyTask 클래스의 생성자에서 taskstart 및 taskcomplete 이벤트

public class TaskStartEventPayload 
{ 
    public SubscriptionToken token { get; set; } 
    public object Argument { get; set; } 
} 

public class TaskStartEvent : CompositePresentationEvent<TaskStartEventPayload> 
{ 
} 

public class TaskCompleteEventPayload 
{ 
    public SubscriptionToken token { get; set; } 
    public object Argument { get; set; } 
    public object Result { get; set; } 
} 
public class TaskCompleteEvent : CompositePresentationEvent<TaskCompleteEventPayload> 
{ 
} 

를 등록하고 페이로드가있는 경우에만 이벤트가 구독하는 동안받은 것과 동일한 토큰을 갖습니다. I이 방법에 볼 이점

 MyTask et = new MyTaskagg, true); 
     et.DoWork += new System.ComponentModel.DoWorkEventHandler(et_DoWork); 
     et.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(et_RunWorkerCompleted);    
     et.RunTaskAsync("Test"); 

더 I는

public void RunTaskAsync(object obj) 
{ 
    //create payload 
    _eventAggregator.GetEvent<TaskStartEvent>().Publish(payload); 
} 
public void TaskStartHandler(TaskStartEventPayload t) 
{ 
    //fire dowork and create payload 
    DoWork(this, args); 
    _eventAggregator.GetEvent<TaskCompleteEvent>().Publish(tc); 
} 
public void TaskCompleteHandler(TaskCompleteEventPayload t) 
{ 
    RunWorkerCompleted(this, args); 
} 

사용이 클래스가 사용될 수있다 이것은 스레드에게 BackgroundWorker에 같이 스레드를 생성하므로 오버 헤드를 사용하지 1이다. 2. UI 스레드에서 RunWorkerCompleted가 실행될 경우 적절한 스레드 마샬링.

Eventaggregator를 Threader로 사용하는 것이 올바른지 알려면 조언을 구하십시오.

답변

1

성능은 거의 향상되지 않지만 코드는 디버깅해야하지만 작동합니다. 마이크로 최적화는 제 생각에는 거의 가치가 없으며 비용을 지원합니다.

EventAggregator는 응용 프로그램의 메시지 버스로 사용하기위한 것이므로 일반적으로 많은 코드를 디버깅하지 않도록 원래의 의도에 맞게 작업하는 것을 선호하지만 이는 개인적인 취향입니다.

이벤트 수집기는 모든 구독을 정리하는 것보다 조금 더 열심히해야합니다. 스레드 풀링에서 얻을 수있는 성능 향상을 초과 할 가능성이 있지만 추측에 불과합니다.