Windows Application은 COM으로 부터 시작되어 전통적으로 STA라는 것은 많이 알려진 내용입니다.
그런데 왜 코딩할 때는 다방면으로 코딩할 수 있도록 열어둔 것일까요?
예를 들어서, Winform에서는 엔트리 포인트인 Main 메서드에서 Application.Run을 통해 Form을 시작하면, UI Thread는 1개가 되고, 이후 Invoke를 사용해야할 때 모두 이 UI Thread를 이용합니다.
그런데 코딩할 때는 Control.Invoke를 통해 컨트롤마다 Invoke를 따로따로 호출할 수 있도록 되어있습니다.
실질적으로 동작은 Control마다 Invoke를 동작시키던, Main Form에 대해 this.Invoke를 하던 동작이 같은데 말이죠.
WPF의 경우에는 Control들이 DispatcherObject를 상속받고 있기 때문에 컨트롤마다 invoke가 가능합니다.
실제 동작은 DispatcherSynchoronizationContext를 통해 하나의 Dispatcher에서 Queueing 되어 처리됨에도 불구하구요.
심지어 DispatcherObject들은 본인을 생성한 Thread가 누구인지 Context의 포인터를 모두 갖고 있습니다.
코드가 다르면 동작이 달라야 한다는 저의 어떤 코딩 철학과도 같은 것인데, 위와 같이 하는 방식이 코드를 보는 저를 불편하게 하네요.
매번 불편해도 그냥 내가 이상한거겠거니 하고 넘어가다가, 오늘은 그냥 궁금해서 한 번 의견을 여쭙니다.
- (UI Thread가 1개일 경우)위에 예시를 든 대로 아무 Control이나 찍고 Invoke를 사용하는 것이 하나의 Window에 대해 Invoke를 사용하는 것과 정말 같을까요? 전 그렇게 알고 있는데 혹시나 싶어 확인차 여쭤봅니다.
- 그렇다면 어차피 같은 동작을 보일텐데 Control마다 Invoke가 가능하도록 열어준 이유는 무엇일까요? private으로 노출을 안시켰다면 코딩하는 사람들이 오용하지 않았을텐데 말이죠.
푸념 반/질문 반 으로 올립니다.