MainThread vs Dispatcher: .NET MAUI UI 스레드 안전한 작업 처리 비교

이 글은 .NET MAUI에서 UI 스레드에서 안전하게 코드를 실행하는 두 가지 방법인 MainThreadDispatcher의 차이점과 사용 시기를 설명합니다.freakyali.medium.com


:thread: MainThread와 Dispatcher 비교

:white_check_mark: MainThread

  • Microsoft.Maui.ApplicationModel 네임스페이스의 정적 클래스입니다.
  • 주로 백그라운드 스레드에서 UI 업데이트가 필요할 때 사용됩니다.
  • 사용 예:
  MainThread.BeginInvokeOnMainThread(() =>
  {
      myLabel.Text = "Updated on main thread";
  });
  • 간단한 UI 업데이트에 적합하지만, 테스트나 구조화된 아키텍처에는 제한적입니다.

:counterclockwise_arrows_button: Dispatcher

  • Microsoft.Maui.Dispatching 네임스페이스의 인스턴스 기반 API입니다.
  • 각 UI 구성 요소(예: Page, View, BindableObject)에 Dispatcher 인스턴스가 할당됩니다.
  • 사용 예:
  this.Dispatcher.Dispatch(() =>
  {
      myLabel.Text = "Updated via Dispatcher";
  });
  • 테스트 가능하고, MVVM 아키텍처에 적합하며, 의존성 주입(DI)을 통해 IDispatcher를 주입받아 사용할 수 있습니다.

:brain: 왜 Dispatcher가 더 나은가?

  1. 스코프 기반: 정적 API 대신 각 UI 요소에 스코프가 지정되어 있습니다.
  2. 테스트 가능성: IDispatcher를 주입받아 단위 테스트가 가능합니다.
  3. 타이머 지원: 타이머 기능을 기본으로 지원하여 외부 라이브러리 의존성이 줄어듭니다.
  4. MVVM 아키텍처에 적합: DI와 결합하여 ViewModel을 정리하고 결합도를 낮출 수 있습니다.

:white_check_mark: 권장 사항

  • 새로운 코드베이스에서는 Dispatcher를 사용하는 것이 좋습니다.
  • 간단한 UI 업데이트에는 MainThread를 사용할 수 있습니다.
  • UI 스레드에 과도한 작업을 몰아서 보내지 않도록 주의합니다.
  • 테스트와 모킹을 고려하여 IDispatcher를 주입받아 사용하는 것이 좋습니다.

이러한 비교를 통해, MainThread는 간단한 작업에 적합한 도구이며, Dispatcher는 구조화된 앱과 테스트 가능한 아키텍처에 더 적합하다는 것을 알 수 있습니다.

1개의 좋아요