2013-07-08 2 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는 여러 스레드에서 호출을 수신합니다. 발표자에게 이러한 입력을 관리하고 싶습니다. 나중에보기 업데이트를 호출합니다. Presenter는 UI 스레드에서 실행됩니다. –

답변

5

보기를 사용하여 UI 스레드에서 발표자 코드를 호출하는 Wiktor 아이디어를 수정합니다.

보기 인터페이스 :

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

발표자 : 나는 다른 방법으로, 당신은 어떻게 든 그냥보기 스레드는 UI를 참조 할 필요가 없다고 생각

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

가장 쉬운 방법은 Invoke으로 적절한 스레드에서 실행을 예약하도록보기를 요청하는 것입니다.

+1

나는 그 순간에 정확히하고있다. 그것은 잘 작동하지만 더 우아한 방법이 있다고 생각했습니다. 흠. 아마도 View 인터페이스에 Invoke를 포함하고 View에 코드를 삽입하지 않고 View.Invoke (...)를 호출 할 수 있습니다. –

+0

Invoke (조치)에 +1. 나는 대신 지정된 방법을 부르고 있었다. 당신은 더 일반적인 솔루션입니다. –