2010-02-03 73 views
1

我在看Prism EventAggregator和它的'很棒。我的一部分,我最擔心的是它能夠正確地將線程編組到UI線程。Prism EventAggregator是否可以用於線程需求?

我想知道是否可以使用此功能爲模塊開發人員提供可用於以與BackgroundWorker類似的方式創建線程的類。類的接口可能有點類似於

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

我一直保留類似於backgroundworker的類型以便更好地理解。在實現我正在註冊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> 
{ 
} 

在構造函數MyTask類我取哪個線程完成需要作爲

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)); 
     } 

我在這裏用的過濾器,其中過濾函數返回註冊只有具有Payload的事件才具有與訂閱時相同的標記。

進一步我用

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); 
} 

這個類可以作爲

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

效益我在這個方法看慣是 1.它使用線程池,所以沒有創建線程中的BackgroundWorker的開銷。 2.如果要在UI線程上執行RunWorkerCompleted,則正確執行線程編組。

如果將eventaggregator用作Threader,請指教。

回答

1

這將工作,雖然它的代碼,你必須調試,只有很少的性能增益。微觀優化在我看來很少值得付出努力和支持成本。

EventAggregator是爲您的應用程序提供的消息總線,我通常更願意使用事物的初衷,以免必須調試大量代碼,但這是我個人的偏好。

事件聚合器將不得不比清理所有這些訂閱工作更困難,這可能會超過您從線程池獲得的任何性能收益,但這只是一個猜測。

相關問題