@Vincent 님 UI/UX 쪽에 글(Windows Application의 UI 처리)을 올리셨는데 답글을 달수 없어서 이쪽에 질문 같은 답변 드려요.
매번 불편해도 그냥 내가 이상한거겠거니 하고 넘어가다가, 오늘은 그냥 궁금해서 한 번 의견을 여쭙니다.
- (UI Thread가 1개일 경우)위에 예시를 든 대로 아무 Control이나 찍고 Invoke를 사용하는 것이 하나의
Window에 대해 Invoke를 사용하는 것과 정말 같을까요? 전 그렇게 알고 있는데 혹시나 싶어 확인차 여쭤봅니다.- 그렇다면 어차피 같은 동작을 보일텐데 Control마다 Invoke가 가능하도록 열어준 이유는 무엇일까요?
private으로 노출을 안시켰다면 코딩하는 사람들이 오용하지 않았을텐데 말이죠.
어떤 분이 잘 정리하신 글을 찾아서 먼저 공유 드립니다.
Windows Forms이든 WPF든 UI 스레드 접근을 돕기 위한 SynchronizationContext 가 준비되어 있는 것으로 알고 있어요.
- Winform: WindowsFormsSynchronizationContext
- WPF: DispatcherSynchronizationContext
그리고 각 컨트롤의 Invoke 또는 BeginInvoke 함수를 노출 한 것은 UI 스레드의 접근성을 높이기 위한 설계로 이해했는데요.
예를 들어서 어떤 버튼 Click 이벤트를 처리하는데 이벤트 처리 함수 내에서 API 호출을 위한 비동기 처리를 하였다면 컨트롤에 직접 결과를 반영할 수 없기 때문에 WindowsFormsSynchronizationContext를 통해 UI 스레드의 특정 컨트롤로 접근해야 하는데 이때 이벤트 처리 함수에 전달된 sender 컨트롤의 Invoke를 사용할 수 있다면 간결하게 처리가 가능할 것 같습니다.
근데 Invoke 함수를 어디서든 부를수 있기 때문에 UI 처리와 비즈니스 로직이 코드 비하인드에서 혼재되는 양상이 발생될 수 있겠네요.