【问题标题】:Can Prism EventAggregator be used for threading needs?Prism EventAggregator 可以用于线程需求吗?
【发布时间】:2010-02-03 06:45:48
【问题描述】:

我在看 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 是否正确。

【问题讨论】:

    标签: multithreading prism eventaggregator


    【解决方案1】:

    这会起作用,尽管它是您必须调试的代码才能获得很少的性能提升。在我看来,微优化很少值得付出努力和支持成本。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多