답변 감사드립니다.
카카오톡 닷넷 채팅방에서도 어제 질문을 올리고 의견을 들어봤었는데, 답이라고 생각한 부분이 있었습니다.
저는 우선 UI Thread가 1개인 경우만 생각하고 있었고, 경험이 풍부하지 못해서 UI Thread가 여러 개일 경우를 전혀 고려하지 않았습니다.
스레딩 모델 - WPF .NET Framework | Microsoft Docs
위 글에서 맨 처음에 UI Thread가 여러개 필요한 경우에 대한 예시를 들어주고 있습니다.
WPF 개발자는 두 개 이상의 스레드를 사용하는 인터페이스를 작성할 필요가 없습니다. 다중 스레드 프로그램은 복잡하고 디버그하기 어려우므로 단일 스레드 솔루션이 있을 경우 피해야 합니다.
하지만 UI 프레임워크는 아무리 설계를 잘하더라도 문제의 모든 부분을 해결하는 단일 스레드 솔루션을 제공할 수 없습니다. WPF가 근접하지만, 스레드를 여러 개 사용해야만 UI(사용자 인터페이스) 응답성이나 애플리케이션 성능이 개선되는 상황이 여전히 있습니다. 일부 배경 자료를 설명한 후 이 문서에서는 이러한 상황 중 일부를 살펴보고 몇몇 하위 수준 세부 정보에 대한 설명으로 마무리 짓습니다.
따라서 UI Thread가 1개 일 경우에는
WPF의 DispatcherObject에서 직접 Invoke를 하는 것, Winform에서 Control.Invoke를 하는 것에는 차이가 없다고 봐야하고 여러 개 일 경우에는 의미가 있다고 볼 수 있습니다.
추가적으로 UI Thread가 여러개인지는 아래 코드를 검색하여 몇 번 호출되었는지 여부에 따라 UI Thread의 개수를 확인 가능할 것입니다.
Winform에서는
Application.Run()
WPF에서는
var dispatcher = Dispatcher.CurrentDispatcher;
var context = new DispatcherSynchronizationContext(dispatcher);
SynchronizationContext.SetSynchronizationContext(context);
dispatcher.Run()
WPF 예시코드는 @aroooong 님께서 주셨습니다. 감사합니다.
따라서 위 코드를 검색해보고 1번밖에 호출되지 않았다면 Control.Invoke / DispatcherObject.Dispatcher.Invoke를 Control이 아닌 해당 Form(this) 또는 Window를 찍고 일관성있게 코딩하는 것이 추후 발생할 수 있는 휴먼에러를 방지할 수 있는 방법이라 생각됩니다.
관심가져주셔서 감사드립니다.
어제 찾아보면서 도움이 되었던 링크들을 레퍼런스용도로 첨부합니다.
WPF의 Threading - Dispatcher, DispatcherObject
병렬 컴퓨팅
동기화 컨텍스트의 이해 Part 1
동기화 컨텍스트의 이해 Part 2