分享方式:


在 .NET MAUI UI 線程上建立線程

Browse sample. 流覽範例

本文說明如何使用 .NET 多平臺應用程式 UI (.NET MAUI) MainThread 類別,在主要 UI 線程上執行程式代碼。 大部分的操作系統會針對涉及使用者介面的程式代碼使用單個線程模型。 需要此此模型才能適當地序列化使用者介面事件,包括按鍵點擊與觸控輸入。 此線程通常稱為 主線程使用者介面線程UI線程。 此模型的缺點是存取使用者介面元素的所有程式碼都必須在應用程式的主執行緒上執行。

MainThread 類別會在 Microsoft.Maui.ApplicationModel 命名空間中提供。

何時為必要專案

應用程式有時需要使用在次要線程上呼叫事件處理程式的事件,例如 AccelerometerCompass 感測器。 當使用速度較快的感應速度時,所有感測器都可能會傳回次要線程上的資訊。 如果事件處理程式需要存取使用者介面元素,則必須在主線程上叫用程式代碼。

在UI線程上執行程序代碼

若要在主執行緒上執行程式碼,請呼叫靜態 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 ,您可以判斷目前的程式碼是否在主線程上執行。 如果呼叫屬性的程式代碼正在主線程上執行,而且false不是,則MainThread.IsMainThread屬性會傳回 true 。 假設在呼叫 MainThread.BeginInvokeOnMainThread之前,您需要判斷程序代碼是否在主線程上執行,這是邏輯的。 例如,下列程式代碼會使用 IsMainThread 來偵測如果程式代碼是在主線程上執行,是否 MyMainThreadCode 應該直接呼叫 方法。 如果它未在主線程上執行,方法會傳遞至 BeginInvokeOnMainThread

if (MainThread.IsMainThread)
    MyMainThreadCode();

else
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

不需要此檢查。 BeginInvokeOnMainThread 本身會測試目前程式代碼是否在主線程上執行。 如果程式代碼是在主線程上執行, BeginInvokeOnMainThread 只要直接呼叫提供的 方法即可。 如果程式代碼是在次要線程上執行,請在 BeginInvokeOnMainThread 主線程上叫用提供的 方法。 因此,如果您執行的程式代碼相同,不論主要或次要線程為何,只要呼叫 BeginInvokeOnMainThread 而不檢查是否需要。 這樣做有微不足道的額外負荷。

您唯一需要檢查 IsMainThread 屬性的原因是,如果您有分支邏輯會根據線程執行不同動作。

其他方法

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