.NET MAUI UI スレッドでスレッドを作成する

Browse sample. サンプルを参照する

この記事では、.NET マルチプラットフォーム アプリ UI (.NET MAUI) MainThread クラスを使用して、メイン UI スレッドでコードを実行する方法について説明します。 ほとんどのオペレーティング システムは、ユーザー インターフェイスを含むコードにシングル スレッド モデルを使用します。 このモデルは、ユーザー インターフェイスのイベント (キーストローク、タッチ入力など) をシリアル化するために必要です。 このスレッドは通常、メイン スレッドユーザー インターフェイス スレッド、または UI スレッドと呼ばれます。 このモデルの欠点は、ユーザー インターフェイス要素にアクセスするすべてのコードを、アプリケーションのメイン スレッドで実行させなければならないという点です。

MainThread クラスは Microsoft.Maui.ApplicationModel 名前空間にあります。

必要なタイミング

アプリケーションでは、Accelerometer センサーや Compass センサーなどのセカンダリ スレッドでイベント ハンドラーを呼び出すイベントを使用する必要がある場合があります。 すべてのセンサーは、高速な検出速度で使用するとセカンダリ スレッドで情報を返す可能性があります。 イベント ハンドラーがユーザー インターフェイス要素にアクセスする必要がある場合は、メイン スレッドでコードを呼び出す必要があります。

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 クラスを使用すると、現在のコードがメインスレッドで実行されているかどうかを判断できます。 MainThread.IsMainThread プロパティは、プロパティを呼び出すコードがメインスレッドで実行されている場合は true を返し、そうでない場合は false を返します。 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 を返します。