2013-07-08 54 views
2

正常處理多線程時,Presenter接收事件並調用View來更新相應的控件。更新演示者對多線程事件,MVP,Winforms的看法

主持人:

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))); 
} 

我的問題是如何調用視圖之前調用在GUI線程演示一個方法調用。喜歡的東西:

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

private void ManageInfoInput(FeedInfo feedInfo) 
{ 
    ... 
    view.UpdateFeedInfo(e.FeedInfo); 
} 
+0

我會說,而不是'BeginInvoke'只是調用'Invoke'這是一個同步調用。它回答你的問題嗎? –

+0

Presenter接收來自多個線程的呼叫。我想在演示者中管理這些輸入。稍後再調用視圖更新。演示者在UI線程中運行。 –

回答

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); 
} 

這樣,我們不把任何代碼視圖。

5

查看:

public void ExecuteDelegateOnUIThread(Delegate action) 
{ 
    this.Invoke(action); 
} 

主持人:

view.ExecuteDelegateOnUIThread(() => { arbitrary code }); 

,我不認爲還有另一種方式,你不知何故只需要參考UI線程視圖被創建,最簡單的方法就是請求視圖在Invoke的適當線程上安排執行。

+1

我正在做那件事。它運作良好,但我認爲有一種更優雅的方式。嗯。可能我可以在視圖界面中包含Invoke,並且可以在Presenter中調用view.Invoke(...),而無需在View中放置任何代碼。 –

+0

用於Invoke(操作)的+1。我正在調用一個指定的方法。你的解決方案更通用。 –

相關問題