Bagikan melalui


Xamarin.Essentials: MainThread

Kelas MainThread memungkinkan aplikasi untuk menjalankan kode pada utas utama eksekusi, dan untuk menentukan apakah blok kode tertentu saat ini berjalan pada utas utama.

Latar belakang

Sebagian besar sistem operasi — termasuk iOS, Android, dan Platform Windows Universal - gunakan model utas tunggal untuk kode yang melibatkan antarmuka pengguna. Model ini diperlukan untuk membuat serial peristiwa antarmuka pengguna dengan benar, termasuk penekanan tombol dan input sentuh. Utas ini sering disebut utas utama atau utas antarmuka pengguna atau utas UI. Kerugian dari model ini adalah bahwa semua kode yang mengakses elemen antarmuka pengguna harus berjalan pada utas utama aplikasi.

Aplikasi terkadang perlu menggunakan peristiwa yang memanggil penanganan aktivitas pada utas eksekusi sekunder. (Kelas Xamarin.EssentialsAccelerometer, , GyroscopeCompass, Magnetometer, dan OrientationSensor semua mungkin mengembalikan informasi pada utas sekunder ketika digunakan dengan kecepatan yang lebih cepat.) Jika penanganan aktivitas perlu mengakses elemen antarmuka pengguna, penanganan aktivitas harus menjalankan kode tersebut pada utas utama. Kelas MainThread memungkinkan aplikasi untuk menjalankan kode ini pada utas utama.

Memulai

Untuk mulai menggunakan API ini, baca panduan memulai untuk Xamarin.Essentials memastikan pustaka diinstal dan disiapkan dengan benar di proyek Anda.

Menjalankan Kode pada Utas Utama

Tambahkan referensi ke Xamarin.Essentials di kelas Anda:

using Xamarin.Essentials;

Untuk menjalankan kode pada utas utama, panggil metode statis MainThread.BeginInvokeOnMainThread . Argumen adalah Action objek, yang hanya merupakan metode tanpa argumen dan tidak ada nilai yang dikembalikan:

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

Dimungkinkan juga untuk menentukan metode terpisah untuk kode yang harus berjalan pada utas utama:

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

Anda kemudian dapat menjalankan metode ini pada utas utama dengan merujuknya dalam BeginInvokeOnMainThread metode :

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Catatan

Xamarin.Forms memiliki metode yang disebut Device.BeginInvokeOnMainThread(Action) yang melakukan hal yang sama seperti MainThread.BeginInvokeOnMainThread(Action). Meskipun Anda dapat menggunakan salah satu metode dalam Xamarin.Forms aplikasi, pertimbangkan apakah kode panggilan memiliki kebutuhan lain untuk dependensi pada Xamarin.Forms. Jika tidak, MainThread.BeginInvokeOnMainThread(Action) kemungkinan merupakan pilihan yang lebih baik.

Menentukan apakah Kode Berjalan di Utas Utama

Kelas ini MainThread juga memungkinkan aplikasi untuk menentukan apakah blok kode tertentu berjalan pada utas utama. Properti IsMainThread mengembalikan jika kode yang memanggil properti berjalan pada utas true utama. Program dapat menggunakan properti ini untuk menjalankan kode yang berbeda untuk utas utama atau utas sekunder:

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

Anda mungkin bertanya-tanya apakah Anda harus memeriksa apakah kode berjalan pada utas sekunder sebelum memanggil BeginInvokeOnMainThread, misalnya, seperti ini:

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

Anda mungkin menduga bahwa pemeriksaan ini dapat meningkatkan performa jika blok kode sudah berjalan pada utas utama.

Namun, pemeriksaan ini tidak diperlukan. Implementasi platform sendiri BeginInvokeOnMainThread memeriksa apakah panggilan dilakukan pada utas utama. Ada sedikit penalti performa jika Anda menelepon BeginInvokeOnMainThread ketika itu tidak benar-benar diperlukan.

Metode Tambahan

Kelas MainThread ini mencakup metode tambahan static berikut yang dapat digunakan untuk berinteraksi dengan elemen antarmuka pengguna dari utas latar belakang:

Metode Argumen Mengembalikan Tujuan
InvokeOnMainThreadAsync<T> Func<T> Task<T> Memanggil pada utas Func<T> utama, dan menunggunya selesai.
InvokeOnMainThreadAsync Action Task Memanggil pada utas Action utama, dan menunggunya selesai.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Memanggil pada utas Func<Task<T>> utama, dan menunggunya selesai.
InvokeOnMainThreadAsync Func<Task> Task Memanggil pada utas Func<Task> utama, dan menunggunya selesai.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Mengembalikan untuk utas SynchronizationContext utama.

API

Temukan video Xamarin lainnya di Channel 9 dan YouTube.