Xamarin.Essentials: MainThread
MainThread sınıfı, uygulamaların ana yürütme iş parçacığında kod çalıştırmasına ve belirli bir kod bloğunun şu anda ana iş parçacığında çalışıp çalışmadığını belirlemesine olanak tanır.
Background
iOS, Android ve Evrensel Windows Platformu dahil olmak üzere çoğu işletim sistemi, kullanıcı arabirimini içeren kod için tek iş parçacıklı bir model kullanır. Bu model, tuş vuruşları ve dokunma girişi de dahil olmak üzere kullanıcı arabirimi olaylarını düzgün bir şekilde seri hale getirmek için gereklidir. Bu iş parçacığı genellikle ana iş parçacığı, kullanıcı arabirimi iş parçacığı veya ui iş parçacığı olarak adlandırılır. Bu modelin dezavantajı, kullanıcı arabirimi öğelerine erişen tüm kodların uygulamanın ana iş parçacığında çalışması gerektiğidir.
Uygulamaların bazen ikincil bir yürütme iş parçacığında olay işleyicisini çağıran olayları kullanması gerekir. Xamarin.Essentials(, , Compass
, Gyroscope
Magnetometer
ve OrientationSensor
tüm sınıflarıAccelerometer
, daha yüksek hızlarla kullanıldığında ikincil bir iş parçacığında bilgi döndürebilir.) Olay işleyicisinin kullanıcı arabirimi öğelerine erişmesi gerekiyorsa, bu kodu ana iş parçacığında çalıştırması gerekir. MainThread sınıfı, uygulamanın bu kodu ana iş parçacığında çalıştırmasına olanak tanır.
Kullanmaya başlayın
Bu API'yi kullanmaya başlamak için kitaplığın projelerinizde düzgün yüklendiğinden ve ayarlandığından emin olmak için Xamarin.Essentials kullanmaya başlama kılavuzunu okuyun.
Ana İş Parçacığında Kod Çalıştırma
Sınıfınızda için Xamarin.Essentials bir başvuru ekleyin:
using Xamarin.Essentials;
Kodu ana iş parçacığında çalıştırmak için statik MainThread.BeginInvokeOnMainThread
yöntemini çağırın. Bağımsız değişken, Action
bağımsız değişken içermeyen ve dönüş değeri olmayan bir yöntem olan bir nesnedir:
MainThread.BeginInvokeOnMainThread(() =>
{
// Code to run on the main thread
});
Ana iş parçacığında çalışması gereken kod için ayrı bir yöntem tanımlamak da mümkündür:
void MyMainThreadCode()
{
// Code to run on the main thread
}
Ardından bu yöntemi yönteminde başvurarak ana iş parçacığında BeginInvokeOnMainThread
çalıştırabilirsiniz:
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
Not
Xamarin.Forms adlı bir yöntemi var Device.BeginInvokeOnMainThread(Action)
ile aynı şeyi MainThread.BeginInvokeOnMainThread(Action)
yapar.
Bir Xamarin.Forms uygulamada iki yöntemden birini kullanabilirsiniz ancak çağıran kodun üzerinde Xamarin.Formsbaşka bir bağımlılık gereksinimi olup olmadığını göz önünde bulundurun. Aksi takdirde, MainThread.BeginInvokeOnMainThread(Action)
büyük olasılıkla daha iyi bir seçenektir.
Kodun Ana İş Parçacığında Çalışıp Çalışmadığını Belirleme
sınıfı, MainThread
uygulamanın ana iş parçacığında belirli bir kod bloğunun çalışıp çalışmadığını belirlemesine de olanak tanır. IsMainThread
Özelliği çağıran kod ana iş parçacığında çalışıyorsa özelliği döndürürtrue
. Bir program bu özelliği kullanarak ana iş parçacığı veya ikincil iş parçacığı için farklı kod çalıştırabilir:
if (MainThread.IsMainThread)
{
// Code to run if this is the main thread
}
else
{
// Code to run if this is a secondary thread
}
örneğin, çağırmadan BeginInvokeOnMainThread
önce kodun ikincil bir iş parçacığında çalışıp çalışmadığını denetlemeniz gerekip gerekmediğini merak edebilirsiniz:
if (MainThread.IsMainThread)
{
MyMainThreadCode();
}
else
{
MainThread.BeginInvokeOnMainThread(MyMainThreadCode);
}
Kod bloğu zaten ana iş parçacığında çalışıyorsa bu denetimin performansı artırabileceğinden şüphelenebilirsiniz.
Ancak, bu denetim gerekli değildir. Platform uygulamaları, çağrının BeginInvokeOnMainThread
ana iş parçacığında yapılıp yapılmaymadığını denetler. Gerçekten gerekli olmadığında ararsanız BeginInvokeOnMainThread
çok az performans cezası vardır.
Ek Yöntemler
sınıfı, MainThread
arka plan iş parçacıklarından kullanıcı arabirimi öğeleriyle etkileşime geçmek için kullanılabilecek aşağıdaki ek static
yöntemleri içerir:
Metot | Bağımsız değişkenler | Döndürülenler | Purpose |
---|---|---|---|
InvokeOnMainThreadAsync<T> |
Func<T> |
Task<T> |
Ana iş parçacığında bir Func<T> çağırır ve tamamlanmasını bekler. |
InvokeOnMainThreadAsync |
Action |
Task |
Ana iş parçacığında bir Action çağırır ve tamamlanmasını bekler. |
InvokeOnMainThreadAsync<T> |
Func<Task<T>> |
Task<T> |
Ana iş parçacığında bir Func<Task<T>> çağırır ve tamamlanmasını bekler. |
InvokeOnMainThreadAsync |
Func<Task> |
Task |
Ana iş parçacığında bir Func<Task> çağırır ve tamamlanmasını bekler. |
GetMainThreadSynchronizationContextAsync |
Task<SynchronizationContext> |
Ana iş parçacığı için değerini SynchronizationContext döndürür. |
API
İlgili Video
Channel 9 ve YouTube'da daha fazla Xamarin videosu bulun.