在多线程事件,MVP,Winforms上更新来自演示者的视图

时间:2013-07-08 19:15:41

标签: c# .net winforms mvp

当处理多线程时,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);
}

2 个答案:

答案 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中添加任何代码。