Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kullanıcılar, makine türü ne olursa olsun, uygulamanızın hesaplama yaparken yanıt vermeye devam etmesini bekler. Bu, gerçekçi fizik sağlama, diskten veya web'den veri yükleme, karmaşık sahneler sunma, sayfalar arasında gezinme veya verileri işleme gibi farklı uygulamalar için farklı şeyler anlamına gelir. Hesaplama türü ne olursa olsun, kullanıcılar uygulamanızın girişlerine göre davranmasını ve yanıt vermemeye başladığı örnekleri ortadan kaldırmasını ister.
Uygulamanız olay odaklıdır: kodunuz bir olaya yanıt olarak iş gerçekleştirir ve bir sonraki olaya kadar boşta durur. Kullanıcı arabirimi için platform kodu (düzen, giriş, olayları oluşturma) ve uygulamanızın ui kodu aynı ui iş parçacığında çalışır. Bu iş parçacığında aynı anda yalnızca bir yönerge yürütülür, bu nedenle uygulama kodunuzun bir olayı işlemesi çok uzun sürerse çerçeve düzeni çalıştıramaz veya yeni olaylar oluşturamaz. Uygulamanızın yanıt verme hızı, ui iş parçacığının işi işlemek için kullanılabilirliğiyle ilgilidir.
Ui öğelerinde neredeyse tüm değişiklikleri yapmak için UI iş parçacığını kullanmanız gerekir. Arka plan iş parçacığından kullanıcı arabirimini güncelleştiremezsiniz, ancak kodun orada çalışmasına neden olmak için DispatcherQueue.TryEnqueue ile ileti gönderebilirsiniz.
Important
WinUI 3 masaüstü uygulamalarında UWP DispatcherQueueyerine kullanınCoreDispatcher. Gönderici kuyruğuna, pencerenizin DispatcherQueue özelliği veya DispatcherQueue.GetForCurrentThread() aracılığıyla erişin.
Note
Ayrı bir işleme iş parçacığı, girişin nasıl işleneceğini veya temel düzeni etkilemeyen kullanıcı arabirimi değişiklikleri uygulayabilir. Örneğin, düzeni etkilemeyen birçok animasyon ve geçiş bu işleme iş parçacığında çalıştırılabilir.
Öğe oluşturmayı geciktirme
Bir uygulamadaki en yavaş aşamalardan bazıları, başlatma ve görünümleri değiştirmedir. Kullanıcının başlangıçta gördüğü kullanıcı arabirimini ortaya çıkarmak için gerekenden daha fazla iş yapmayın. Örneğin, aşamalı olarak açıklanmış içerik veya açılan içerik için kullanıcı arabirimi oluşturmayın.
- Öğeleri geciktirmek için x:Load özniteliğini kullanın.
- Program aracılığıyla isteğe bağlı olarak ağaç içine öğe ekleyin.
Kullanıcı arabirimi iş parçacığının, meşgul olmadığında işlemesi için işi kuyruğa almak üzere DispatcherQueue.TryEnqueue öğesini düşük öncelikle kullanın.
Zaman uyumsuz API’leri kullanma
Uygulamanızın yanıt vermesini sağlamak için, kullanılabilir olduğunda API'lerin zaman uyumsuz sürümlerini kullanın. Eşzamansız bir API, etkin yürütme iş parçacığınızın önemli bir süre boyunca hiçbir zaman bloke olmamasını sağlar. UI iş parçacığından bir API'yi çağırdığınızda, mevcutsa her zaman eşzamansız sürümünü kullanın.
İş yükünü arka plan iş parçacıklarına aktarın
Hızlı bir şekilde dönmek için olay işleyicileri yazın. Önemsiz olmayan bir iş miktarının gerçekleştirilmesi gerektiğinde, bunu bir arka plan iş parçacığında zamanlayın ve geri dönün.
C#'ta await işlecini kullanarak işi zaman uyumsuz olarak zamanlayabilirsiniz. Ancak, await çalışmanın bir arka plan iş parçacığında çalıştırıldığını garanti etmez. Birçok Windows Uygulama SDK'sı API sizin için bir arka plan iş parçacığı üzerinde çalışmayı zamanlar, ancak uygulama kodunuzu yalnızca awaitkullanarak çağırırsanız, ui iş parçacığında bu yöntemi çalıştırırsınız. Uygulama kodunuzu bir arka plan iş parçacığında açıkça çalıştırmanız gerekir. C# dilinde, Task.Run'a kod geçirerek bunu gerçekleştirin.
Kullanıcı arabirimi öğelerine yalnızca kullanıcı arabirimi iş parçacığından erişebileceğinizi unutmayın. Arka plan çalışmasını başlatmadan önce ui öğelerine erişmek için UI iş parçacığını kullanın veya kullanıcı arabirimi güncelleştirmelerini ui iş parçacığına geri göndermek için arka plan iş parçacığını kullanın DispatcherQueue.TryEnqueue .
public sealed partial class MainWindow : Window
{
// Declared in MainWindow.xaml as x:Name="statusText".
private TextBlock statusText;
private async void NextMove_Click(object sender, RoutedEventArgs e)
{
// The await causes the handler to return immediately.
await Task.Run(() => ComputeNextMove());
// Now update the UI with the results.
// This code runs on the UI thread after ComputeNextMove completes.
statusText.Text = "Move computed.";
}
private void ComputeNextMove()
{
// Perform background work here.
// Don't directly access UI elements from this method.
}
}
Bu örnekte, NextMove_Click işleyici, kullanıcı arabirimi iş parçacığının yanıt vermeye devam etmesini sağlamak için await noktasında geri döner.
ComputeNextMove (arka plan iş parçacığında çalışır) tamamlandıktan sonra, yürütme bu işleyicide yeniden devam eder ve kalan kod kullanıcı arayüzünü sonuçlarla günceller.
İlgili içerik
Windows developer