SynchronizationContext는 다른 스레드에서 UI를 업데이트하는 방법을 제공합니다 (Send 메소드를 통해 또는 Post 메소드를 통해 비동기 적으로).
다음 예를 살펴보십시오.
private void SynchronizationContext SyncContext = SynchronizationContext.Current;
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(Work1);
thread.Start(SyncContext);
}
private void Work1(object state)
{
SynchronizationContext syncContext = state as SynchronizationContext;
syncContext.Post(UpdateTextBox, syncContext);
}
private void UpdateTextBox(object state)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
SynchronizationContext.Current는 UI 스레드의 동기화 컨텍스트를 반환합니다. 이것을 어떻게 알 수 있습니까? 모든 폼 또는 WPF 앱이 시작될 때 컨텍스트는 UI 스레드에서 설정됩니다. WPF 앱을 만들고 예제를 실행하면 버튼을 클릭하면 약 1 초 동안 잠자고 파일 내용이 표시됩니다. UpdateTextBox 메소드 (Work1)의 호출자는 Thread에 전달 된 메소드이므로 기본 UI 스레드가 아닌 해당 스레드를 휴면해야합니다. Work1 메소드가 스레드로 전달 되더라도 SyncContext 인 오브젝트도 허용합니다. 살펴보면 UpdateTextBox 메서드가 Work1 메서드가 아니라 syncContext.Post 메서드를 통해 실행되는 것을 볼 수 있습니다. 다음을 살펴보십시오.
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
마지막 예와이 예는 동일하게 실행됩니다. 둘 다 작업을 수행하는 동안 UI를 차단하지 않습니다.
결론적으로 SynchronizationContext를 스레드로 생각하십시오. 스레드가 아니며 스레드를 정의합니다 (모든 스레드에 SyncContext가있는 것은 아닙니다). UI를 업데이트하기 위해 Post 또는 Send 메서드를 호출 할 때마다 기본 UI 스레드에서 UI를 정상적으로 업데이트하는 것과 같습니다. 어떤 이유로 다른 스레드에서 UI를 업데이트해야하는 경우 스레드에 기본 UI 스레드의 SyncContext가 있는지 확인하고 실행하려는 메소드를 사용하여 Send 또는 Post 메소드를 호출하십시오. 세트.
이것이 당신에게 도움이되기를 바랍니다, 친구!