UI 접근

Part 3/¶ C#(C sharp) 2020. 3. 15. 18:26

wpf에서는 main Thread 만 UI 객체에 접근이 가능하다.

별도 클래스에 EventHandler를 추가하고, 여기에 UI 내용을 업데이트 하는 함수를 연결하여 스레드로 처리 하려는 경우에도, UI 내용을 업데이트 하는 함수는 별도 스레드로 취급되어 UI에 접근할 수 없다.

따라서 main Thread 에게 UI 업데이트를 요청해야 하고, 이러한 동작을 위해 Dispatcher 클래스 내에 Invoke(), BeginInvoke()메소드가 존재한다.

아래 코드는 스레드로 처리되는 작업의 진행 상황을 프로세스바로 표시하기 위해 스레드의 진행 상태 변화 시 호출되는 메소드이다. (EventHandler에 등록된 함수)

아래 메소드에서 UI에 등록된 2개의 요소를 참조한다.(lb_count,pbar_main)
(1)은 각 요소별 Dispatcher.Invoke()(혹은 BeginInvoke())수행하는 구문이다.
(2)는접근 하는요소가 많은 경우 좀 더 편리하게 접근하기 위해서 추가한 구문이다.
(2)도 동작은 잘하는데 뭔가 정말 문제 없이 수행되는가는 잘 모르겠다.
-> 내 생각은 저기서 this가 UI를 관리하는 Main Thread를 지징하는 요소로 사용하고 싶은건데, 적절한 요소인지가...

private void chPos(object sender, int i) {

    //(1)
    lb_count.Dispatcher.Invoke(
            new Action( () => {
                lb_count.Content = i + "/" + maxVal;
            }
        )
    );

    pbar_main.Dispatcher.Invoke(
            new Action( () => {
                pbar_main.Value = i;
            }
        )
    );

    //(2)
    this.Dispatcher.BeginInvoke(new Action(() => { 
                                                        lb_count.Content = i + "/" + maxVal; 
                                                        pbar_main.Value = i; 
                                                    } 
                                            ) 
    ); 

}// end chPos
 

'Part 3 > ¶ C#(C sharp)' 카테고리의 다른 글

Event 처리  (0) 2020.03.08
C# 2.0  (0) 2018.09.14
C# 버전 특징  (0) 2018.09.14
AND