Windows Application의 UI 처리

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의 포인터를 모두 갖고 있습니다.

코드가 다르면 동작이 달라야 한다는 저의 어떤 코딩 철학과도 같은 것인데, 위와 같이 하는 방식이 코드를 보는 저를 불편하게 하네요.

매번 불편해도 그냥 내가 이상한거겠거니 하고 넘어가다가, 오늘은 그냥 궁금해서 한 번 의견을 여쭙니다.

  1. (UI Thread가 1개일 경우)위에 예시를 든 대로 아무 Control이나 찍고 Invoke를 사용하는 것이 하나의 Window에 대해 Invoke를 사용하는 것과 정말 같을까요? 전 그렇게 알고 있는데 혹시나 싶어 확인차 여쭤봅니다.
  2. 그렇다면 어차피 같은 동작을 보일텐데 Control마다 Invoke가 가능하도록 열어준 이유는 무엇일까요? private으로 노출을 안시켰다면 코딩하는 사람들이 오용하지 않았을텐데 말이죠.

푸념 반/질문 반 으로 올립니다.

2개의 좋아요

.NET Source Browser로 살펴보니 코드가 완전히 동일하지는 않겠지만, 차이점은 Invoke()하려는 컨트롤의 핸들이 아직 생성이 안되어 있다면 관련 처리를 하는 정도라… 글쎄요. ^^; 어제 질문글을 보고 저도 한참 생각을 해봤는데 제가 경험했던 사용 안에서는 어떤 컨트롤의 인스턴스인가가 그렇게 중요하지 않았던것으로 기억해서, 명확한 답을 드리기는 힘드네요.

개인적으로, public이 아닌 protected 접근자가 맞지 않았었을까 생각해봅니다.

하지만 BeginInvoke()의 경우 해당 컨트롤이 준비가 되었을 때 실행해줘서 이것은 public 접근자가 맞는것 같습니다.

3개의 좋아요
1개의 좋아요