1

我在看 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));
        }

在这里,我正在向过滤器注册,其中过滤器函数仅在它具有与订阅时获得的相同令牌时才返回事件。

我进一步使用

 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. 适当的线程编组,以防 RunWorkerCompleted 在 UI 线程上执行。

请建议将 eventtaggregator 用作 Threader 是否正确。

4

1 回答 1

1

这将起作用,尽管它是您必须调试的代码以获得非常小的性能增益。在我看来,微优化很少值得付出努力和支持成本。

EventAggregator 旨在成为您应用程序的消息总线,我通常更喜欢将事物用于其初衷,以免我必须调试大量代码,但这是我个人的偏好。

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

于 2010-02-03T14:09:31.463 回答