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

Mir*_*pov 2 .net c# mvp winforms

处理多线程时,Presenter通常会收到事件并调用View来更新相应的控件.

主持人:

private void EventAggregator_InfoUpdated(object sender, InfoUpdatedEventArgs e)
{
    view.UpdateFeedInfo(e.FeedInfo);
}
Run Code Online (Sandbox Code Playgroud)

视图:

public void UpdateFeedInfo(FeedInfo feedInfo)
{
    if (!control.IsHandleCreated && !control.IsDisposed) return;

    control.BeginInvoke((MethodInvoker) (() => control.Update(feedInfo)));
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在调用view之前在GUI线程中调用presenter中的方法调用.就像是:

private void EventAggregator_InfoUpdated(object sender, InfoUpdatedEventArgs e)
{
    //InvokeInUiThread// ManageInfoInput(e.FeedInfo);
}

private void ManageInfoInput(FeedInfo feedInfo)
{
    ...
    view.UpdateFeedInfo(e.FeedInfo);
}
Run Code Online (Sandbox Code Playgroud)

Mir*_*pov 7

我将修改Wiktor的想法,使用View来调用UI线程中的演示者代码.

查看界面:

public interface IView
{
    IAsyncResult BeginInvoke(Delegate method);
    object Invoke(Delegate method);
}
Run Code Online (Sandbox Code Playgroud)

主持人:

private void EventAggregator_InfoUpdated(object sender, InfoUpdatedEventArgs e)
{
    view.Invoke(new Action(() => ManageInfoInput(e.FeedInfo)));
}

private void ManageInfoInput(FeedInfo feedInfo)
{
    ...
    view.UpdateFeedInfo(feedInfo);
}
Run Code Online (Sandbox Code Playgroud)

这样我们就不会在View中添加任何代码.


Wik*_*hla 5

视图:

public void ExecuteDelegateOnUIThread( Delegate action )
{
   this.Invoke( action ); 
}
Run Code Online (Sandbox Code Playgroud)

主持人:

view.ExecuteDelegateOnUIThread( () => { arbitrary code } );
Run Code Online (Sandbox Code Playgroud)

我不认为还有另一种方式,你不知何故只需要引用创建视图的UI线程,最简单的方法就是让视图在适当的线程上安排执行Invoke.