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
, , Gyroscope
Compass
, 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. |