2012-07-04 2 views
0

나는 배경 스레드에서 호출 많은 기능을 가지고 있지만, 다음 GUI 작업을 수행해야합니다. 따라서 각 함수에서 GUI 스레드로 컨텍스트를 전환합니다. 그러나 내 코드를 향상시킬 수 있는지 궁금하네요?같이 Recurse

public void FunctionABC(string test) 
{ 
    // Make sure we are in the GUI thread. 
    if (!this.Dispatcher.CheckAccess()) 
    { 
    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => FunctionABC(test))); return; 
    } 
    // main body of function 
} 

내가 컨텍스트 스위치를 명시 적으로 내 자신의 함수 이름을 언급하는 데에 문제가있는 주요 부분 (I 부분적으로이 싫어하는 : 여기

내 코드는 일반적으로 지금의 모습의 삭감 예제 내가 코드를 내가 복사 이름을 변경하고 붙여 잊고 계속하기 때문에!)

어떤 아이디어 컨텍스트 스위칭의보다 일반적인 방법, 예를 위해 함수를 명시 적으로 명명하는 것을 피하는 영리한 포인터를 통해 내 자신의 함수를 다시 호출하는 방법은 무엇입니까? 이 조각 같은

뭔가 (그러나 구축하지 않는) 좋은 것 :

this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => this(test))); return; 

생각을?

답변

2

어떻게 별도의 방법에 파견 코드를 잡아 당겨 어떻습니까?

public void Dispatch(Action action) 
{ 
    if (!this.Dispatcher.CheckAccess()) 
    { 
     this.Dispatcher.Invoke(DispatcherPriority.Normal, action); 
    } 
    else 
    { 
     action(); 
    } 
} 

과 :

Dispatch(() => FunctionABC(test)); 
+0

일을하고 타이밍 LULZ :) – Jon

+0

@ 존 : 5 초 간격으로 동일한 답. :) – casablanca

+0

@ 카사 블랑카 : 잘 생겼어, 내가 가야 겠어. +1 너와 존! – Surfbutler

2

당신이 재사용 가능한 방법을 수행 할 수 있습니다

private void ExecuteOnDispatcherThread(Action action) 
{ 
    if (!this.Dispatcher.CheckAccess()) { 
     this.Dispatcher.Invoke(DispatcherPriority.Normal, action); 
    } 
    else { 
     action(); 
    } 
} 

을 그리고 이런 식으로 호출 :

this.ExecuteOnDispatcherThread(() => FunctionABC(test)); 
+0

+1 너도! :) – casablanca