2017-10-08 14 views
2

나는 Dispatcher.CurrentDispatcher.BeginInvoke 및 BeginInvoke 의 차이점에 대한 혼란 스러워요 나는 updateCounts로 방법의 코드는 무시되고 작동하지 않았다 코드의 다음 부분을 한Dispatcher.CurrentDispatcher.BeginInvoke를 사용하는 이유는 내 GUI를 업데이트하지 않지만 BeginInvoke를 사용하는 이유는 무엇입니까?

:

private void Start() 
{ 
    _testResults = new TestResults(ModelNameTextBox.Text); 
    _timer = new System.Threading.Timer(UpdateCounts, null, 0, 500);    
} 

private void UpdateCounts(object info) 
{ 
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => 
    { 
     PassCountLabel.Text = _testResults.PassedCount.ToString(); 
     RequestCountLabel.Text = _testResults.RequestedCount.ToString();     
    })); 
} 
Dispatcher.CurrentDispatcher을 제거

그러나 한 번, 그것은 잘 작동 :

private void UpdateCounts(object info) 
{ 
    BeginInvoke(new Action(() => 
    { 
     PassCountLabel.Text = _testResults.PassedCount.ToString(); 
     RequestCountLabel.Text = _testResults.RequestedCount.ToString();     
    })); 
} 
+2

이와 같이 WPF와 Winforms 코드를 임의로 혼합 할 수 없습니다. WinForms 버전의 Application.Run()을 사용하는 Main() 진입 점이있는 것 같습니다. Dispatcher를 사용하면 응용 프로그램에 디스패처 루프가 없으므로 코드를 실행하지 못합니다. 이것이 * 의도적 인 * 경우, 즉이 코드는 라이브러리에 있고 라이브러리를 사용하는 WPF 또는 Winforms 앱인지 여부를 추측 할 수 없습니다. 그러면 매우 다른 방식으로해야합니다. SynchronizationContext.Current를 생성자에 복사해야합니다. 그러나 다시 라이브러리의 컨트롤을 업데이트하는 것은 좋지 않습니다. 섞지 마십시오. –

답변

0

Dispatcher.CurrentDispatcher.BeginInvoke은 UI 스레드에서 호출 한 경우에만 작동합니다. 그렇지 않으면 현재 스레드를 호출합니다.

당신은 UI 스레드 전화를Application.Current.Dispatcher을 사용해야합니다.