Xamarin.Essentials: MainThreadXamarin.Essentials: MainThread

MainThread クラスを使用すると、アプリケーションでコードを実行のメイン スレッドで実行させたり、コードの特定のブロックがメイン スレッドで現在実行中であるかどうかを調べたりすることができます。The MainThread class allows applications to run code on the main thread of execution, and to determine if a particular block of code is currently running on the main thread.

背景Background

ほとんどのオペレーティング システム — iOS、Android、ユニバーサル Windows プラットフォームなど — では、ユーザー インターフェイスに関連するコードのためにシングル スレッド モデルが使用されます。Most operating systems — including iOS, Android, and the Universal Windows Platform — use a single-threading model for code involving the user interface. このモデルは、ユーザー インターフェイスのイベント (キーストローク、タッチ入力など) をシリアル化するために必要です。This model is necessary to properly serialize user-interface events, including keystrokes and touch input. 多くの場合、このスレッドは_メイン スレッド_、ユーザー インターフェイス スレッド、または _UI スレッド_と呼ばれます。This thread is often called the main thread or the user-interface thread or the UI thread. このモデルの欠点は、ユーザー インターフェイス要素にアクセスするすべてのコードを、アプリケーションのメイン スレッドで実行させなければならないという点です。The disadvantage of this model is that all code that accesses user interface elements must run on the application's main thread.

アプリケーションでは、イベント ハンドラーを実行のセカンダリ スレッドで呼び出すイベントを使用することが必要な場合があります。Applications sometimes need to use events that call the event handler on a secondary thread of execution. (Xamarin.Essentials のクラス AccelerometerCompassGyroscopeMagnetometerOrientationSensor はすべて、高速で使用すると、セカンダリ スレッドに関する情報を返す可能性があります。)イベント ハンドラーがユーザー インターフェイス要素にアクセスする必要がある場合は、そのコードをメイン スレッドで実行させる必要があります。(The Xamarin.Essentials classes Accelerometer, Compass, Gyroscope, Magnetometer, and OrientationSensor all might return information on a secondary thread when used with faster speeds.) If the event handler needs to access user-interface elements, it must run that code on the main thread. MainThread クラスを使用すると、アプリケーションでこのコードをメイン スレッドで実行させることができます。The MainThread class allows the application to run this code on the main thread.

作業開始Get started

この API の使用を始めるには、Xamarin.Essentials の概要ガイドを読み、ライブラリが正しくインストールされてプロジェクトに設定されていることを確認してください。To start using this API, read the getting started guide for Xamarin.Essentials to ensure the library is properly installed and set up in your projects.

メイン スレッドでのコードの実行Running Code on the Main Thread

自分のクラスに Xamarin.Essentials への参照を追加します。Add a reference to Xamarin.Essentials in your class:

using Xamarin.Essentials;

メイン スレッドでコードを実行するには、静的メソッド MainThread.BeginInvokeOnMainThread を呼び出します。To run code on the main thread, call the static MainThread.BeginInvokeOnMainThread method. 引数は Action オブジェクトです。これは単に、引数も戻り値も持たないメソッドです。The argument is an Action object, which is simply a method with no arguments and no return value:

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

また、メイン スレッドで実行させる必要があるコード用に、個別のメソッドを定義することもできます。It is also possible to define a separate method for the code that must run on the main thread:

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

こうすると、BeginInvokeOnMainThread メソッド内でこのメソッドを参照することで、これをメイン スレッドで実行させることができます。You can then run this method on the main thread by referencing it in the BeginInvokeOnMainThread method:

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

注意

Xamarin.Forms には Device.BeginInvokeOnMainThread(Action) と呼ばれるメソッドがあります。Xamarin.Forms has a method called Device.BeginInvokeOnMainThread(Action) これは MainThread.BeginInvokeOnMainThread(Action) と同じ処理を行います。that does the same thing as MainThread.BeginInvokeOnMainThread(Action). Xamarin.Forms アプリではどちらのメソッドも使用できますが、呼び出し元のコードが他にも Xamarin.Forms に依存する必要があるかどうかを検討してください。While you can use either method in a Xamarin.Forms app, consider whether or not the calling code has any other need for a dependency on Xamarin.Forms. ない場合は、MainThread.BeginInvokeOnMainThread(Action) が適切な選択であると考えられます。If not, MainThread.BeginInvokeOnMainThread(Action) is likely a better option.

コードがメイン スレッドで実行されているかどうかの判断Determining if Code is Running on the Main Thread

MainThread クラスを使用すると、アプリケーションで、コードの特定のブロックがメイン スレッドで実行中であるかどうかを調べることもできます。The MainThread class also allows an application to determine if a particular block of code is running on the main thread. IsMainThread プロパティを呼び出すコードがメイン スレッドで実行されている場合、プロパティは true を返します。The IsMainThread property returns true if the code calling the property is running on the main thread. プログラムでこのプロパティを使用して、メイン スレッド用またはセカンダリ スレッド用に別のコードを実行させることができます。A program can use this property to run different code for the main thread or a secondary thread:

if (MainThread.IsMainThread)
{
    // Code to run if this is the main thread
}
else
{
    // Code to run if this is a secondary thread
}

BeginInvokeOnMainThread を呼び出す前に、コードがセカンダリ スレッドで実行されているかどうかをチェックする必要があるか疑問に思うかもしれません。たとえば、次のような場合です。You might wonder if you should check if code is running on a secondary thread before calling BeginInvokeOnMainThread, for example, like this:

if (MainThread.IsMainThread)
{
    MyMainThreadCode();
}
else
{
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
}

コードのブロックが既にメイン スレッドで実行されている場合、このチェックによってパフォーマンスが向上するのではないかと思うかもしれません。You might suspect that this check might improve performance if the block of code is already running on the main thread.

しかし、このチェックは必要ではありません。However, this check is not necessary. プラットフォームによる BeginInvokeOnMainThread の実装自体によって、呼び出しがメイン スレッドで行われたかどうかが確認されます。The platform implementations of BeginInvokeOnMainThread themselves check if the call is made on the main thread. 不要な BeginInvokeOnMainThread を呼び出す場合のパフォーマンスの低下はごくわずかです。There is very little performance penalty if you call BeginInvokeOnMainThread when it's not really necessary.

APIAPI