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