Xamarin.Essentials: MainThread
MainThread 클래스를 사용하면 애플리케이션이 주 실행 스레드에서 코드를 실행할 수 있으며, 특정 코드 블록이 현재 주 스레드에서 실행되고 있는지 확인할 수 있습니다.
배경
iOS, Android 및 유니버설 Windows 플랫폼을 포함한 대부분의 운영 체제는 사용자 인터페이스와 관련된 코드에 대해 단일 스레딩 모델을 사용합니다. 이 모델은 키 입력 및 터치 입력을 포함한 사용자 인터페이스 이벤트를 올바르게 직렬화하는 데 필요합니다. 이 스레드를 주 스레드, 사용자 인터페이스 스레드 또는 UI 스레드라고 합니다. 이 모델의 단점은 사용자 인터페이스 요소에 액세스하는 모든 코드가 애플리케이션의 주 스레드에서 실행되어야 한다는 것입니다.
애플리케이션이 보조 실행 스레드의 이벤트 처리기를 호출하는 이벤트를 사용해야 하는 경우도 있습니다. (Xamarin.Essentials 클래스 Accelerometer
, Compass
, Gyroscope
, Magnetometer
및 OrientationSensor
는 더 빠른 속도로 사용할 경우 모두 보조 스레드에 대한 정보를 반환할 수 있습니다.) 이벤트 처리기가 사용자 인터페이스 요소에 액세스해야 하는 경우, 주 스레드에서 해당 코드를 실행해야 합니다. MainThread 클래스를 사용하면 애플리케이션이 주 실행 스레드에서 이 코드를 실행할 수 있습니다.
시작하기
이 API를 사용하기 전에 라이브러리가 제대로 설치되고 프로젝트에 설정되어 있는지 확인하기 위해 Xamarin.Essentials에 대한 시작 가이드를 읽어보세요.
주 스레드에서 코드 실행
클래스에서 Xamarin.Essentials에 대한 참조를 추가합니다.
using Xamarin.Essentials;
주 스레드에서 코드를 실행하려면 static MainThread.BeginInvokeOnMainThread
메서드를 호출합니다. 인수는 Action
개체로, 단순히 인수와 반환 값이 없는 메서드입니다.
MainThread.BeginInvokeOnMainThread(() =>
{
// Code to run on the main thread
});
주 스레드에서 실행해야 하는 코드에 대해 별도의 메서드를 정의할 수도 있습니다.
void MyMainThreadCode()
{
// Code to run on the main thread
}
그런 다음, BeginInvokeOnMainThread
메서드에서 참조하여 주 스레드에서 이 메서드를 실행할 수 있습니다.
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
참고 항목
Xamarin.Forms 에는 라는 메서드가 있습니다. Device.BeginInvokeOnMainThread(Action)
(MainThread.BeginInvokeOnMainThread(Action)
와 동일한 작업을 수행함).
Xamarin.Forms 앱에서 두 메서드 중 하나를 사용할 수 있지만, 호출 코드에 Xamarin.Forms에 대한 다른 종속성 요구가 있는지 여부를 고려합니다. 다른 종속성 요구가 없으면 MainThread.BeginInvokeOnMainThread(Action)
가 더 나은 옵션일 가능성이 큽니다.
코드가 주 스레드에서 실행되고 있는지 확인
MainThread
클래스를 사용하면 애플리케이션은 특정 코드 블록이 주 스레드에서 실행되고 있는지도 확인할 수 있습니다. IsMainThread
속성은 해당 속성을 호출하는 코드가 주 스레드에서 실행되고 있는 경우 true
를 반환합니다. 프로그램은 이 속성을 사용하여 주 스레드 또는 보조 스레드에 대해 서로 다른 코드를 실행할 수 있습니다.
if (MainThread.IsMainThread)
{
// Code to run if this is the main thread
}
else
{
// Code to run if this is a secondary thread
}
예를 들어 BeginInvokeOnMainThread
를 호출하기 전에 다음과 같이 코드가 보조 스레드에서 실행되고 있는지 확인해야 한다고 생각할 수 있습니다.
if (MainThread.IsMainThread)
{
MyMainThreadCode();
}
else
{
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
}
코드 블록이 이미 주 스레드에서 실행되고 있다면 이 검사를 통해 성능을 향상할 수 있지 않을까 하는 의심을 가질 수 있습니다.
그러나 이 검사는 필요하지 않습니다. 플랫폼의 BeginInvokeOnMainThread
구현 자체에서 호출이 주 스레드에서 수행되었는지 확인합니다. 필요하지 않을 때 BeginInvokeOnMainThread
를 호출해도 성능에 미치는 영향은 거의 없습니다.
추가 방법
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 를 반환합니다. |