C#

[C#] - WPF Dispatcher 패턴의 탄생 배경과 WPF에서의 필요성

dev_SiWoo 2025. 7. 28. 16:38

1. UI 프레임워크의 근본적인 문제

Win32/WinForms 시대의 한계

// WinForms에서의 크로스 스레드 문제
public partial class WinFormsExample : Form
{
    private void BackgroundWork()
    {
        Thread thread = new Thread(() =>
        {
            //  InvalidOperationException 발생!
            this.label1.Text = "Updated from background thread";
            
            // WinForms의 해결책 - Control.Invoke
            this.Invoke(new Action(() =>
            {
                this.label1.Text = "Updated safely";
            }));
        });
        thread.Start();
    }
}

 

문제점:

  • 각 컨트롤마다 Invoke 메서드 필요
  • 일관성 없는 스레드 처리
  • 복잡한 UI 구조에서 관리 어려움

2. 왜 UI는 단일 스레드여야 하는가?

멀티스레드 UI의 문제점:

Thread A: Button의 위치를 (100, 100)으로 이동
Thread B: 동시에 Button의 크기를 50x50으로 변경
Thread C: 동시에 Button의 색상을 빨간색으로 변경

결과: 
- 렌더링 중 상태 불일치
- 화면 깜빡임
- 예측 불가능한 동작
- 데드락 위험

 

 

3. WPF에서 Dispatcher 패턴의 핵심 아이디어

기존 방식과 Dispatcher 패턴 비교

 

Dispatcher 패턴은 "멀티스레드 상황에서 싱글스레드 UI를 안전하게 관리하는 교통경찰" 역할을 한다.

 

WPF가 이를 도입한 것은 단순히 기술적 선택이 아니라, 점점 복잡해지는 애플리케이션 환경에서

개발자가 스레드 안전성을 쉽게 보장할 수 있도록 하기 위한 아키텍처이다.