Aracılığıyla paylaş


UI iş parçacığının yanıt vermeye devam etmesini sağlayın

Kullanıcılar, makinenin türü ne olursa olsun, bir uygulamanın hesaplama yaparken yanıt vermeye devam etmesini bekler. Bu, farklı uygulamalar için farklı şeyler anlamına gelir. Bazıları için bu, daha gerçekçi fizik sağlamaya, diskten veya web'den daha hızlı veri yüklemeye, karmaşık sahneleri hızla sunmaya ve sayfalar arasında gezinmeye, hızlı bir şekilde yol tarifleri bulmaya veya verileri hızlı bir şekilde işlemeye çevrilir. Hesaplama türü ne olursa olsun, kullanıcılar uygulamalarının girişleri üzerinde işlem gerçekleştirmesini ve "düşünürken" yanıt vermemeye başladığı örnekleri ortadan kaldırmasını ister.

Uygulamanız olay odaklıdır, yani kodunuz bir olaya yanıt olarak çalışma gerçekleştirir ve ardından sonrakine kadar boşta durur. Kullanıcı arabirimi için platform kodu (düzen, giriş, olayları oluşturma vb.) ve uygulamanızın ui kodu aynı ui iş parçacığında yürütülür. Bu iş parçacığında aynı anda yalnızca bir yönerge yürütülebilir, bu nedenle uygulama kodunuzun bir olayı işlemesi çok uzun sürerse çerçeve düzeni çalıştıramaz veya kullanıcı etkileşimini temsil eden 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.

Neredeyse tüm değişiklikleri yapmak için, UI iş parçacığını kullanmanız gerekir; buna UI türleri oluşturma ve üyelerine erişme de dahildir. Arka plan iş parçacığından kullanıcı arabirimini güncelleştiremezsiniz, ancak kodun orada çalıştırılmasına neden olmak için CoreDispatcher.RunAsync ile ileti gönderebilirsiniz.

Not Tek özel durum, girişin işlenme şeklini veya temel düzeni etkilemeyecek ui değişiklikleri uygulayabilen ayrı bir işleme iş parçacığı olmasıdır. Örneğin, düzeni etkilemeyen birçok animasyon ve geçiş bu işleme iş parçacığında çalıştırılabilir.

Öğe örneklemesini geciktirme

Bir uygulamadaki en yavaş aşamalardan bazıları başlatma ve görünümleri değiştirme olabilir. 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ış kullanıcı arabirimi ve açılır pencerelerin içeriği için kullanıcı arabirimi oluşturmayın.

CoreDispatcher.RunIdleAsync kuyrukları, meşgul olmadığında ui iş parçacığının işlemesi için çalışır.

Zaman uyumsuz API’leri kullanma

Platform, uygulamanızın yanıt vermesine yardımcı olmak için api'lerinin birçoğunun zaman uyumsuz sürümlerini sağlar. Asenkron bir API, etkin yürütme iş parçacığınızın uzun süre engellenmemesini sağlar. UI iş parçacığından bir API çağırdığınızda, kullanılabilir durumdaysa zaman uyumsuz sürümü kullanın. Eşzamanlı olmayan desenlerle programlama hakkında daha fazla bilgi için bkz. Eşzamanlı Olmayan Programlama veya C# veya Visual Basic'de eşzamanlı olmayan API'leri çağırma.

İşleri arka plan işlemlerine aktarma

Etkinlik işleyicilerini hızlıca geri dönmeleri için yazın. Önemsiz bir iş miktarının gerçekleştirilmesi gereken durumlarda, bunu bir arka plan iş parçacığında zamanlayın ve geri dönün.

C# içindeki await işlecini, Visual Basic'teki Await işlecini veya C++ içindeki temsilcileri kullanarak zaman uyumsuz olarak çalışma zamanlayabilirsiniz. Ancak bu, zamanladığınız çalışmanın arka plan iş parçacığında çalışacağını garanti etmez. Evrensel Windows Platformu (UWP) API'lerinin çoğu sizin için arka plan iş parçacığında iş planlar, ancak uygulama kodunuzu yalnızca await veya bir temsilci kullanarak çağırırsanız, bu temsilciyi veya yöntemi kullanıcı arabirimi iş parçacığında çalıştırırsınız. Uygulama kodunuzu bir arka plan iş parçacığında ne zaman çalıştırmak istediğinizi açıkça söylemeniz gerekir. C# ve Visual Basic'te Task.Runkodu geçirerek bunu gerçekleştirebilirsiniz.

Kullanıcı arabirimi öğelerine yalnızca kullanıcı arabirimi iş parçacığından erişilebileceğini unutmayın. Arka plan çalışmasını başlatmadan önce kullanıcı arabirimi öğelerine erişmek için ui iş parçacığını kullanın ve/veya arka plan iş parçacığında CoreDispatcher.RunAsync veya CoreDispatcher.RunIdleAsync kullanın.

Arka plan iş parçacığı üzerinde gerçekleştirilebilecek bir çalışma örneği, bir oyundaki bilgisayar yapay zekasının hesaplanmasıdır. Bilgisayarın bir sonraki hareketini hesaplayan kodun yürütülmesi çok zaman alabilir.

public class AsyncExample
{
    private async void NextMove_Click(object sender, RoutedEventArgs e)
    {
        // The await causes the handler to return immediately.
        await System.Threading.Tasks.Task.Run(() => ComputeNextMove());
        // Now update the UI with the results.
        // ...
    }

    private async System.Threading.Tasks.Task ComputeNextMove()
    {
        // Perform background work here.
        // Don't directly access UI elements from this method.
    }
}
Public Class AsyncExample
    ' ...
    Private Async Sub NextMove_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Await Task.Run(Function() ComputeNextMove())
        ' update the UI with results
    End Sub

    Private Async Function ComputeNextMove() As Task
        ' ...
    End Function
    ' ...
End Class

Bu örnekte, NextMove_Click işleyicisi, UI İş Parçacığının yanıt vermesini sağlamak için await'de geri döner. Ancak ComputeNextMove (arka plan iş parçacığında yürütülen) tamamlandıktan sonra, yürütme bu işleyiciye geri döner. İşleyicideki kalan kod, kullanıcı arabirimini sonuçlarla güncelleştirir.

Not UWP için ThreadPool ve ThreadPoolTimer API'leri de vardır ve bu api benzer senaryolar için kullanılabilir. Daha fazla bilgi için bkz. Çoklu iş parçacığı ve zaman uyumsuz programlama.