Aracılığıyla paylaş


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, GyroscopeMagnetometerve 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

Channel 9 ve YouTube'da daha fazla Xamarin videosu bulun.