Prism EventAggregator可以用于线程需求吗?

时间:2010-02-03 06:45:49

标签: multithreading prism eventaggregator

我正在看Prism EventAggregator及其'伟大的。我最关心的是它能够正确地将线程编组到UI线程。

我想知道我是否可以使用此功能为模块开发人员提供一个可用于以与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 个答案:

答案 0 :(得分:1)

这样可以工作,虽然它是代码,你必须调试以获得非常小的性能提升。在我看来,微优化很少值得付出努力和支持成本。

EventAggregator应该是你的应用程序的消息总线,我通常更喜欢使用它们的初衷,以免我需要调试很多代码,但这是我个人的偏好。

事件聚合器必须比清理所有这些订阅更加努力,这可能会超过从线程池中获得的任何性能提升,但这只是猜测。