当处理多线程时,Presenter通常会收到事件并调用View来更新相应的控件。
主讲人:
private void EventAggregator_InfoUpdated(object sender, InfoUpdatedEventArgs e)
{
view.UpdateFeedInfo(e.FeedInfo);
}
查看:
public void UpdateFeedInfo(FeedInfo feedInfo)
{
if (!control.IsHandleCreated && !control.IsDisposed) return;
control.BeginInvoke((MethodInvoker) (() => control.Update(feedInfo)));
}
我的问题是如何在调用view之前在GUI线程中调用presenter中的方法调用。类似的东西:
private void EventAggregator_InfoUpdated(object sender, InfoUpdatedEventArgs e)
{
//InvokeInUiThread// ManageInfoInput(e.FeedInfo);
}
private void ManageInfoInput(FeedInfo feedInfo)
{
...
view.UpdateFeedInfo(e.FeedInfo);
}
答案 0 :(得分:5)
查看:
public void ExecuteDelegateOnUIThread( Delegate action )
{
this.Invoke( action );
}
主讲人:
view.ExecuteDelegateOnUIThread( () => { arbitrary code } );
我认为还有另一种方式,你不得不引用创建视图的UI线程,最简单的方法就是让视图在{{1}的适当线程上安排执行}}
答案 1 :(得分:5)
我将修改Wiktor的想法,使用View来调用UI线程中的演示者代码。
查看界面:
public interface IView
{
IAsyncResult BeginInvoke(Delegate method);
object Invoke(Delegate method);
}
主讲人:
private void EventAggregator_InfoUpdated(object sender, InfoUpdatedEventArgs e)
{
view.Invoke(new Action(() => ManageInfoInput(e.FeedInfo)));
}
private void ManageInfoInput(FeedInfo feedInfo)
{
...
view.UpdateFeedInfo(feedInfo);
}
这样我们就不会在View中添加任何代码。