.NET MAUI UI 스레드에서 스레드 만들기

Browse sample. 샘플 찾아보기

이 문서에서는 .NET 다중 플랫폼 앱 UI(.NET MAUI) MainThread 클래스를 사용하여 기본 UI 스레드에서 코드를 실행하는 방법을 설명합니다. 대부분의 운영 체제는 사용자 인터페이스와 관련된 코드에 단일 스레딩 모델을 사용합니다. 이 모델은 키 입력 및 터치 입력을 포함한 사용자 인터페이스 이벤트를 올바르게 직렬화하는 데 필요합니다. 이 스레드는 종종 기본 스레드, 사용자 인터페이스 스레드 또는 UI 스레드라고도합니다. 이 모델의 단점은 사용자 인터페이스 요소에 액세스하는 모든 코드가 애플리케이션의 주 스레드에서 실행되어야 한다는 것입니다.

MainThread 클래스는 Microsoft.Maui.ApplicationModel 네임스페이스에서 사용할 수 있습니다.

필요한 경우

애플리케이션은 보조 스레드(Compass예: Accelerometer 센서)에서 이벤트 처리기를 호출하는 이벤트를 사용해야 하는 경우가 있습니다. 더 빠른 감지 속도와 함께 사용할 경우 모든 센서가 보조 스레드에 대한 정보를 반환할 수 있습니다. 이벤트 처리기가 사용자 인터페이스 요소에 액세스해야 하는 경우 기본 스레드에서 코드를 호출해야 합니다.

UI 스레드에서 코드 실행

주 스레드에서 코드를 실행하려면 static MainThread.BeginInvokeOnMainThread 메서드를 호출합니다. 인수는 Action 개체로, 단순히 인수와 반환 값이 없는 메서드입니다.

MainThread.BeginInvokeOnMainThread(() =>
{
    // Code to run on the main thread
});

코드에 대한 별도의 메서드를 정의한 다음 메서드를 사용하여 해당 코드를 BeginInvokeOnMainThread 호출할 수도 있습니다.

void MyMainThreadCode()
{
    // Code to run on the main thread
}

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

호출이 필요한지 확인

클래스를 MainThread 사용하면 현재 코드가 기본 스레드에서 실행 중인지 확인할 수 있습니다. 속성을 MainThread.IsMainThread 호출하는 코드가 기본 스레드 false 에서 실행되고 있지 않은 경우 속성이 반환 true 됩니다. 호출MainThread.BeginInvokeOnMainThread하기 전에 코드가 기본 스레드에서 실행 중인지 확인해야 한다고 가정하는 것은 논리적입니다. 예를 들어 다음 코드는 코드가 IsMainThread 기본 스레드에서 실행되는 경우 메서드를 직접 호출해야 하는지 감지 MyMainThreadCode 하는 데 사용합니다. 기본 스레드에서 실행되지 않는 경우 메서드는 다음으로 BeginInvokeOnMainThread전달됩니다.

if (MainThread.IsMainThread)
    MyMainThreadCode();

else
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

이 검사 필요하지 않습니다. BeginInvokeOnMainThread현재 코드가 기본 스레드에서 실행 중인지 여부를 자체 테스트합니다. 코드가 기본 스레드 BeginInvokeOnMainThread 에서 실행되는 경우 제공된 메서드를 직접 호출하기만 하면됩니다. 코드가 보조 스레드 BeginInvokeOnMainThread 에서 실행되는 경우 기본 스레드에서 제공된 메서드를 호출합니다. 따라서 실행하는 코드가 기본 또는 보조 스레드와 관계없이 동일한 경우 필요한 경우 검사 없이 호출 BeginInvokeOnMainThread 하기만 하면 됩니다. 이렇게 하면 오버헤드가 무시할 수 있습니다.

속성을 검사 IsMainThread 유일한 이유는 스레드에 따라 다른 작업을 수행하는 분기 논리가 있는 경우입니다.

추가 방법

MainThread 클래스에는 백그라운드 스레드의 사용자 인터페이스 요소와 상호 작용하는 데 사용될 수 있는 다음 추가 static 메서드가 포함됩니다.

메서드 인수 반환 목적
InvokeOnMainThreadAsync<T> Func<T> Task<T> 주 스레드에서 Func<T>를 호출하고 완료될 때까지 기다립니다.
InvokeOnMainThreadAsync Action Task 주 스레드에서 Action을 호출하고 완료될 때까지 기다립니다.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> 주 스레드에서 Func<Task<T>>를 호출하고 완료될 때까지 기다립니다.
InvokeOnMainThreadAsync Func<Task> Task 주 스레드에서 Func<Task>를 호출하고 완료될 때까지 기다립니다.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> 주 스레드의 SynchronizationContext를 반환합니다.