2013-06-05 2 views
0

WPF 응용 프로그램에서 직접 메서드 호출과 Dispatcher.Invoke() 전달의 차이점은 무엇입니까? 지금까지 읽은 것을 바탕으로, 둘 다 동일한 UI 스레드에서 실행됩니다, 그렇지 않습니까?Dispatcher.Invoke() vs 스레드가 생성되지 않는 경우

샘플 코드

사례 1 :

public sealed partial class Window 
{ 
    private void SomeEventHandler(object sender, EventArgs e) 
    { 
     SomeMethod(); 
    } 
} 

사례 2 : 당신이 실행하는 작업을해야 할 때마다

public sealed partial class Window 
{ 
    private void SomeEventHandler(object sender, EventArgs e) 
    { 
     Dispatcher.Invoke(SomeMethod, DispatcherPriority.Send); 
    } 
} 
+3

더 많은 컨텍스트를 제공해야합니다. UI 스레드 (예 : 백그라운드 작업)에서 아직 실행하지 않은 경우 큰 차이가 있습니다. 샘플 코드가 도움이 될 것입니다. –

+0

Dispatcher.BeginInvoke, btw와 달리 UI 스레드 내부에서 Dispatcher.Invoke를 호출하는 것은 의미가 없습니다. 더 자세한 내용은? – JeffRSon

+0

@JeffRSon, 그것이 내가 당신을 올바르게 이해한다면, 내가 확인하고 싶은 것입니다. 질문을 설명하기 위해 샘플 코드를 게시했습니다. – zer0ne

답변

6

이 질문은 코드가 UI 스레드에서 실행될 때만 의미가 있습니다. 분명히 작업자 스레드에서 호출 할 경우 의 차이가 있습니다. Invoke()가 아닌 Dispatcher.BeginInvoke를 사용합니다. 따라서 "유용 할 수 있습니다"앵글을 작동합시다.

예, 대리인 대상은 두 경우 모두 UI 스레드에서 실행됩니다. 차이는 일 때 에 있습니다. Dispatcher.BeginInvoke()를 사용하면 프로그램이 다시 유휴 상태가되어 디스패처 루프에 다시 들어갈 때까지 실행되지 않습니다. 일반적으로 현재 메서드가 반환 된 후 활성화 된 방법에 따라 다릅니다.

다소 우스꽝 스럽지만, 어떤 경우에는 이 유용 할 수 있습니다. 메소드가 이벤트로 인해 활성화 될 때 유용하며 이벤트 처리기에서 무언가를하면 재진입 문제로 인해 위험합니다. 고전적인 위험은 이벤트가 다시 시작되면 코드가이 웹 사이트의 이름으로 폭탄을 질리게됩니다. 또는 이벤트가 발생한 후 코드가 실행되면 이벤트 처리기에서 수행 한 작업이 취소됩니다. Dispatcher.BeginInvoke()를 사용하면 이벤트 처리기 코드의 실행을 지연시킬 수 있습니다. 그렇지 않으면 C# 5에서 async/await 작동 방식을 모델링합니다.

1

당신이 배경 스레드에서 UI 스레드 디스패처를 사용할 수 있습니다 예를 들어 UI 스레드는 TextBox.Text를 업데이트합니다.

more Dispatcher maintains a prioritized queue of work itemsDispatcherPriority 과 같은 작업을 실행할 수 있습니다. 예를 들어 Background priority로 작업을 수행하려는 경우. 다른 모든 유휴가 아닌 작업이 완료된 후 작업이 처리된다는 의미입니다.

관련 문제