나는 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로 사용하는 것이 올바른지 알려면 조언을 구하십시오.