Xamarin.Essentials:MainThread
MainThread 類別可讓應用程式在主執行緒上執行程式碼,並判斷特定程式碼區塊目前是否在主執行緒上執行。
背景
大部分的作業系統 (包括 iOS、Android 與通用 Windows 平台) 都為牽涉到使用者介面的程式碼使用單一執行緒處理模型。 需要此此模型才能適當地序列化使用者介面事件,包括按鍵點擊與觸控輸入。 此執行緒通常稱為「主執行緒」或「使用者介面執行緒」或「UI 執行緒」。 此模型的缺點是存取使用者介面元素的所有程式碼都必須在應用程式的主執行緒上執行。
應用程式有時候需要使用呼叫次要執行緒上之事件處理常式的事件。 (類別 Xamarin.EssentialsAccelerometer
、 Compass
、 Gyroscope
、 Magnetometer
和 OrientationSensor
全都可以在以更快的速度使用時,傳回次要線程上的資訊。如果事件處理程式需要存取使用者介面元素,它必須在主線程上執行該程序代碼。 MainThread 類別可讓應用程式在主執行緒上執行此程式碼。
開始使用
若要開始使用此 API,請閱讀 入門指南Xamarin.Essentials,以確保連結庫已正確安裝並設定在您的專案中。
在只執行緒上執行程式碼
在類別中新增 的 Xamarin.Essentials 參考:
using Xamarin.Essentials;
若要在主執行緒上執行程式碼,請呼叫靜態 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
,會對效能造成極小的影響。
其他方法
static
類別包含下列其他 MainThread
方法,可用來與背景執行緒中的使用者介面元素互動:
方法 | 引數 | 傳回 | 目的 |
---|---|---|---|
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 。 |