Aracılığıyla paylaş


.NET MAUI UI iş parçacığında iş parçacığı oluşturma

Browse sample. Örneğe göz atın

Bu makalede, ana kullanıcı arabirimi iş parçacığında kod çalıştırmak için .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) MainThread sınıfını nasıl kullanabileceğiniz açıklanmaktadır. Ç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.

MainThread sınıfı ad alanında Microsoft.Maui.ApplicationModel kullanılabilir.

Ne zaman gereklidir?

Uygulamaların bazen veya Compass algılayıcıları gibi ikincil bir iş parçacığında olay işleyicisini Accelerometer çağıran olayları kullanması gerekir. Tüm algılayıcılar, daha hızlı algılama hızlarıyla kullanıldığında ikincil bir iş parçacığında bilgi döndürebilir. Olay işleyicisinin kullanıcı arabirimi öğelerine erişmesi gerekiyorsa, ana iş parçacığında kodu çağırması gerekir.

Ui iş parçacığında kod çalıştırma

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
});

Kod için ayrı bir yöntem tanımlamak ve ardından bu kodu yöntemiyle çağırmak BeginInvokeOnMainThread da mümkündür:

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

MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Çağırmanın gerekli olup olmadığını belirleme

sınıfıyla MainThread , geçerli kodun ana iş parçacığında çalışıp çalışmadığını belirleyebilirsiniz. MainThread.IsMainThread özelliği, özelliğini çağıran kod ana iş parçacığında çalışıyorsa ve false çalışmıyorsa döndürürtrue. çağırmadan MainThread.BeginInvokeOnMainThreadönce kodun ana iş parçacığında çalışıp çalışmadığını belirlemeniz gerektiğini varsaymak mantıklıdır. Örneğin aşağıdaki kod IsMainThread , kodun ana iş parçacığında çalışıyor olması durumunda yönteminin MyMainThreadCode doğrudan çağrılıp çağrılmadığını algılamak için kullanır. Ana iş parçacığında çalışmıyorsa yöntemi öğesine BeginInvokeOnMainThreadgeçirilir:

if (MainThread.IsMainThread)
    MyMainThreadCode();

else
    MainThread.BeginInvokeOnMainThread(MyMainThreadCode);

Bu denetim gerekli değildir. BeginInvokeOnMainThread geçerli kodun ana iş parçacığında çalışıp çalışmadığını test eder. Kod ana iş parçacığında çalışıyorsa, BeginInvokeOnMainThread sağlanan yöntemi doğrudan çağırır. Kod ikincil bir iş parçacığında çalışıyorsa, BeginInvokeOnMainThread ana iş parçacığında sağlanan yöntemi çağırır. Bu nedenle, çalıştırdığınız kod ana veya ikincil iş parçacığından bağımsız olarak aynıysa, gerekli olup olmadığını denetlemeden çağrısı BeginInvokeOnMainThread yapmanız yeterlidir. Bunu yaparken göz ardı edilebilir bir ek yük vardır.

Özelliğini denetlemeniz IsMainThread gereken tek neden, iş parçacığına göre farklı bir şey yapacak dallanma mantığınız olmasıdı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 İadeler Amaç
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.