Xamarin.Essentials: MainThread

Mainthread sınıfı, uygulamaların yürütmenin ana iş parçacığında kod çalıştırmasına ve belirli bir kod bloğunun ana iş parçacığında çalışmakta olup olmadığını tespit etmesine olanak tanır.

Arka Plan

iOS, Android ve Evrensel Windows Platformu dahil çoğu işletim sistemi, kullanıcı arabirimiyle ilgili kod için tek iş parçacığı modeli kullanır. Bu model, tuş vuruşları ve dokunmatik giriş dahil olmak üzere Kullanıcı arabirimi olaylarını doğru şekilde serileştirmek için gereklidir. Bu iş parçacığı genellikle ana iş parçacığı veya 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ıştırılması gerekir.

Uygulamaların bazen bir yürütme iş parçacığında olay işleyicisini çağıran olayları kullanması gerekir. ( Xamarin.Essentials Sınıflar,,, AccelerometerCompassGyroscopeMagnetometer ve OrientationSensor hepsi daha hızlı bir şekilde 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 izin verir.

başlarken

Bu API 'yi kullanmaya başlamak için, kitaplığın projelerinizde düzgün bir şekilde yüklendiğinden ve ayarlandığından emin olmak için Başlarken Kılavuzunu okuyun.

Ana Iş parçacığında kod çalıştırma

Sınıfınıza bir başvuru ekleyin Xamarin.Essentials :

using Xamarin.Essentials;

Ana iş parçacığında kod çalıştırmak için statik MainThread.BeginInvokeOnMainThread yöntemi çağırın. Bağımsız değişkeni Action , yalnızca 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ımlanması da mümkündür:

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

Daha sonra bu yöntemi, metoduna başvurarak ana iş parçacığında çalıştırabilirsiniz BeginInvokeOnMainThread :

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Not

Xamarin.Forms adlı bir yöntemi vardırDevice.BeginInvokeOnMainThread(Action) Bu, ile aynı şeyi yapar MainThread.BeginInvokeOnMainThread(Action) . Bir uygulamada her iki yöntemi de kullanabilirsiniz; ancak, Xamarin.Forms çağıran kodun bağımlılık için başka bir ihtiyacı olup olmadığını göz önünde bulundurun Xamarin.Forms . Değilse, MainThread.BeginInvokeOnMainThread(Action) büyük olasılıkla daha iyi bir seçenektir.

Kodun ana Iş parçacığında çalışıp çalışmadığını belirleme

MainThreadSınıfı ayrıca bir uygulamanın, ana iş parçacığında belirli bir kod bloğunun çalışıp çalışmadığını belirlemesine izin verir. IsMainThreadÖzelliği, true özelliği çağıran kod ana iş parçacığında çalışıyorsa döndürür. Bir program, ana iş parçacığı veya ikincil bir iş parçacığı için farklı kod çalıştırmak üzere bu özelliği kullanabilir:

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şağıdaki gibi, çağrılmadan önce ikincil bir iş parçacığında kodun çalışıp çalışmadığını denetlemeniz gerektiğine merak edebilirsiniz BeginInvokeOnMainThread :

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

Kod bloğu ana iş parçacığında zaten çalışıyorsa bu denetim performansının iyileştirebileceğini kuşkulu olabilirsiniz.

Ancak, bu denetim gerekli değildir. Kendi platform uygulamaları, BeginInvokeOnMainThread çağrının ana iş parçacığında yapılmış olup olmadığını denetler. Gerçekten gerekli olmadığında çağrdığınızda çok az performans cezası vardır BeginInvokeOnMainThread .

Ek Yöntemler

MainThreadSınıfı, static arka plan iş parçacıklarında Kullanıcı arabirimi öğeleriyle etkileşim kurmak için kullanılabilecek aşağıdaki ek yöntemleri içerir:

Yöntem Bağımsız değişkenler Döndürülenler Amaç
InvokeOnMainThreadAsync<T> Func<T> Task<T> Func<T>Ana iş parçacığında bir çağırır ve tamamlanmasını bekler.
InvokeOnMainThreadAsync Action Task ActionAna iş parçacığında bir çağırır ve tamamlanmasını bekler.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Func<Task<T>>Ana iş parçacığında bir çağırır ve tamamlanmasını bekler.
InvokeOnMainThreadAsync Func<Task> Task Func<Task>Ana iş parçacığında bir çağırır ve tamamlanmasını bekler.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> SynchronizationContextAna iş parçacığı için öğesini döndürür.

API

Channel 9 ve YouTube'da daha fazla Xamarin videoları bulun.