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)
我将修改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中添加任何代码.
视图:
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.
| 归档时间: |
|
| 查看次数: |
1393 次 |
| 最近记录: |