Olay Tabanlı Zaman Uyumsuz Desene Genel Bakış

Aynı anda birçok görev gerçekleştiren, ancak kullanıcı etkileşimine yanıt vermeye devam eden uygulamalar genellikle birden çok iş parçacığı kullanan bir tasarım gerektirir. Ad System.Threading alanı, yüksek performanslı çok iş parçacıklı uygulamalar oluşturmak için gereken tüm araçları sağlar, ancak bu araçların etkili bir şekilde kullanılması çok iş parçacıklı yazılım mühendisliği konusunda önemli bir deneyim gerektirir. Nispeten basit çok iş parçacıklı uygulamalar BackgroundWorker için bileşen basit bir çözüm sağlar. Daha karmaşık zaman uyumsuz uygulamalar için Olay Tabanlı Zaman Uyumsuz Desene uygun bir sınıf uygulamayı göz önünde bulundurun.

Olay Tabanlı Zaman Uyumsuz Desen, çok iş parçacıklı tasarımda bulunan karmaşık sorunların çoğunu gizlerken çok iş parçacıklı uygulamaların avantajlarını kullanıma sunar. Bu düzeni destekleyen bir sınıf kullanmak şunları yapmanızı sağlayabilir:

  • İndirmeler ve veritabanı işlemleri gibi zaman alan görevleri uygulamanızı kesintiye uğratmadan "arka planda" gerçekleştirin.

  • Her işlem tamamlandığında bildirim alarak aynı anda birden çok işlemi yürütebilirsiniz.

  • Uygulamanızı durdurmadan ("engelleme") kaynakların kullanılabilir olmasını bekleyin.

  • Bilinen olaylar ve temsilciler modelini kullanarak bekleyen zaman uyumsuz işlemlerle iletişim kurun. Olay işleyicilerini ve temsilcileri kullanma hakkında daha fazla bilgi için bkz . Olaylar.

Olay Tabanlı Zaman Uyumsuz Deseni destekleyen bir sınıfın MethodNameAsync adlı bir veya daha fazla yöntemi olacaktır. Bu yöntemler, geçerli iş parçacığında aynı işlemi gerçekleştiren zaman uyumlu sürümleri yansıtabilir. Sınıfın bir MethodName Completed olayı da olabilir ve MethodName AsyncCancel (veya yalnızca CancelAsync) yöntemi olabilir.

PictureBox , Olay Tabanlı Zaman Uyumsuz Deseni destekleyen tipik bir bileşendir. Yöntemini çağırarak Load bir görüntüyü zaman uyumlu olarak indirebilirsiniz, ancak görüntü büyükse veya ağ bağlantısı yavaşsa, indirme işlemi tamamlanana ve çağrısı geri dönene Load kadar uygulamanız yanıt vermeyi durdurur.

Görüntü yüklenirken uygulamanızın çalışmaya devam etmesi için yöntemini çağırabilir LoadAsync ve diğer tüm olayları işleyebileceğiniz gibi olayı işleyebilirsiniz LoadCompleted . yöntemini çağırdığınızda LoadAsync , indirme işlemi ayrı bir iş parçacığında ("arka planda") devam ederken uygulamanız çalışmaya devam eder. Görüntü yükleme işlemi tamamlandığında olay işleyiciniz çağrılır ve olay işleyiciniz, indirme işleminin AsyncCompletedEventArgs başarıyla tamamlanıp tamamlanmadığını belirlemek için parametresini inceleyebilir.

Olay Tabanlı Zaman Uyumsuz Desen, zaman uyumsuz bir işlemin iptal edilebileceğini gerektirir ve PictureBox denetim yöntemiyle CancelAsync bu gereksinimi destekler. Çağrısı CancelAsync , bekleyen indirmeyi durdurma isteği gönderir ve görev iptal LoadCompleted edildiğinde olay oluşturulur.

Dikkat

İndirme işleminin istek yapıldığı gibi CancelAsync bitmesi mümkündür, bu nedenle Cancelled iptal isteğini yansıtmayabilir. Buna yarış durumu denir ve çok iş parçacıklı programlamada sık karşılaşılan bir sorundur. Çok iş parçacıklı programlamayla ilgili sorunlar hakkında daha fazla bilgi için bkz . Yönetilen İş Parçacığı Oluşturma En İyi Yöntemleri.

Olay Tabanlı Zaman Uyumsuz Desenin Özellikleri

Olay Tabanlı Zaman Uyumsuz Desen, belirli bir sınıf tarafından desteklenen işlemlerin karmaşıklık düzeyine bağlı olarak çeşitli biçimler alabilir. En basit sınıfların tek bir MethodNameAsync yöntemi ve buna karşılık gelen MethodNameCompleted olayı olabilir. Daha karmaşık sınıflar, her biri karşılık gelen MethodNameCompleted olayına ve bu yöntemlerin zaman uyumlu sürümlerine sahip çeşitli MethodNameAsync yöntemlerine sahip olabilir. Sınıflar isteğe bağlı olarak her zaman uyumsuz yöntem için iptali, ilerleme durumunu raporlamayı ve artımlı sonuçları destekleyebilir.

Zaman uyumsuz bir yöntem ayrıca birden çok bekleyen çağrıyı (birden çok eşzamanlı çağrı) destekleyerek kodunuzun bekleyen diğer işlemleri tamamlamadan önce bunu birkaç kez çağırmasına olanak tanıyabilir. Bu durumun doğru işlenmesi, uygulamanızın her işlemin tamamlanmasını izlemesini gerektirebilir.

Olay Tabanlı Zaman Uyumsuz Desen örnekleri

ve PictureBox bileşenleri, SoundPlayer Olay Tabanlı Zaman Uyumsuz Desenin basit uygulamalarını temsil eder. ve BackgroundWorker bileşenleri, WebClient Olay Tabanlı Zaman Uyumsuz Desenin daha karmaşık uygulamalarını temsil eder.

Aşağıda, desene uyan örnek bir sınıf bildirimi verilmiştir:

Public Class AsyncExample  
    ' Synchronous methods.  
    Public Function Method1(ByVal param As String) As Integer
    Public Sub Method2(ByVal param As Double)
  
    ' Asynchronous methods.  
    Overloads Public Sub Method1Async(ByVal param As String)
    Overloads Public Sub Method1Async(ByVal param As String, ByVal userState As Object)
    Public Event Method1Completed As Method1CompletedEventHandler  
  
    Overloads Public Sub Method2Async(ByVal param As Double)
    Overloads Public Sub Method2Async(ByVal param As Double, ByVal userState As Object)
    Public Event Method2Completed As Method2CompletedEventHandler  
  
    Public Sub CancelAsync(ByVal userState As Object)
  
    Public ReadOnly Property IsBusy () As Boolean  
  
    ' Class implementation not shown.  
End Class  
public class AsyncExample  
{  
    // Synchronous methods.  
    public int Method1(string param);  
    public void Method2(double param);  
  
    // Asynchronous methods.  
    public void Method1Async(string param);  
    public void Method1Async(string param, object userState);  
    public event Method1CompletedEventHandler Method1Completed;  
  
    public void Method2Async(double param);  
    public void Method2Async(double param, object userState);  
    public event Method2CompletedEventHandler Method2Completed;  
  
    public void CancelAsync(object userState);  
  
    public bool IsBusy { get; }  
  
    // Class implementation not shown.  
}  

Kurgusal AsyncExample sınıfın iki yöntemi vardır ve bunların ikisi de zaman uyumlu ve zaman uyumsuz çağrıları destekler. Zaman uyumlu aşırı yüklemeler herhangi bir yöntem çağrısı gibi davranır ve işlemi çağıran iş parçacığında yürütür; işlem zaman alıyorsa, çağrı döndürülmeden önce fark edilebilir bir gecikme olabilir. Zaman uyumsuz aşırı yüklemeler işlemi başka bir iş parçacığında başlatır ve hemen döndürür ve işlem "arka planda" yürütülürken çağıran iş parçacığının devam etmesi için izin verir.

Zaman Uyumsuz Yöntem Aşırı Yüklemeleri

Zaman uyumsuz işlemler için iki aşırı yükleme olabilir: tekli çağırma ve çoklu çağırma. Bu iki formu yöntem imzalarıyla ayırt edebilirsiniz: çoklu çağırma formunun adlı userStateek bir parametresi vardır. Bu form, bekleyen zaman uyumsuz işlemlerin bitmesini beklemeden kodunuzun birden çok kez çağırmasını Method1Async(string param, object userState) mümkün kılar. Öte yandan, önceki bir çağrı tamamlanmadan önce çağırmayı Method1Async(string param) denerseniz, yöntemi bir InvalidOperationExceptionoluşturur.

userState Çoklu çağırma aşırı yüklemelerinin parametresi, zaman uyumsuz işlemler arasında ayrım yapmanızı sağlar. her çağrısı Method1Async(string param, object userState)için benzersiz bir değer (örneğin, GUID veya karma kod) sağlarsınız ve her işlem tamamlandığında, olay işleyiciniz işlemin hangi örneğinin tamamlanma olayını tetiklediğini belirleyebilir.

Bekleyen İşlemleri İzleme

Çoklu çağrı aşırı yüklemelerini kullanırsanız, kodunuzun bekleyen görevler için nesneleri (görev kimlikleri) izlemesi userState gerekir. her çağrısı için Method1Async(string param, object userState)genellikle yeni, benzersiz userState bir nesne oluşturur ve bunu bir koleksiyona eklersiniz. Bu userState nesneye karşılık gelen görev tamamlanma olayını yükselttiğinde, tamamlama yöntemi uygulamanız bunu inceler AsyncCompletedEventArgs.UserState ve koleksiyonunuzdan kaldırır. Bu şekilde kullanıldığında, userState parametresi görev kimliğinin rolünü alır.

Not

Birden çok çağrı aşırı yüklemesine yönelik çağrılarınızda için userState benzersiz bir değer sağlamaya dikkat etmeniz gerekir. Benzersiz olmayan görev kimlikleri, zaman uyumsuz sınıfın bir ArgumentExceptionoluşturmasına neden olur.

Bekleyen İşlemleri İptal Etme

Zaman uyumsuz işlemlerin tamamlanmadan önce herhangi bir zamanda iptal edilebilmesi önemlidir. Olay Tabanlı Zaman Uyumsuz Deseni uygulayan sınıflar bir yönteme (yalnızca bir CancelAsync zaman uyumsuz yöntem varsa) veya MethodName AsyncCancel yöntemine (birden çok zaman uyumsuz yöntem varsa) sahip olur.

Birden çok çağrıya izin veren yöntemler, her görevin ömrünü izlemek için kullanılabilecek bir userState parametre alır. CancelAsync belirli bekleyen görevleri iptal etmenizi sağlayan bir userState parametre alır.

gibi Method1Async(string param)bir kerede yalnızca tek bir bekleyen işlemi destekleyen yöntemler iptal edilemez.

İlerleme Güncelleştirmeler ve Artımlı Sonuçları Alma

Olay Tabanlı Zaman Uyumsuz Desenine bağlı olan bir sınıf isteğe bağlı olarak ilerlemeyi ve artımlı sonuçları izlemek için bir olay sağlayabilir. Bu genellikle methodname ProgressChanged olarak adlandırılır ProgressChangedve buna karşılık gelen olay işleyicisi bir ProgressChangedEventArgs parametre alır.

Olayın olay işleyicisi ProgressChanged , zaman uyumsuz bir görevin tamamlanma yüzdesini belirlemek için özelliğini inceleyebilir ProgressChangedEventArgs.ProgressPercentage . Bu özellik 0 ile 100 arasında değişir ve özelliğini ProgressBargüncelleştirmek Value için kullanılabilir. Birden çok zaman uyumsuz işlem bekliyorsa, ilerleme durumunu ProgressChangedEventArgs.UserState bildiren işlemi ayırt etmek için özelliğini kullanabilirsiniz.

Zaman uyumsuz işlemler devam ettikçe bazı sınıflar artımlı sonuçlar bildirebilir. Bu sonuçlar, öğesinden ProgressChangedEventArgs türetilen bir sınıfta depolanır ve türetilen sınıfta özellikler olarak görünür. Bu sonuçlara, özelliğine erişebileceğiniz gibi olay için ProgressChanged olay işleyicisinde ProgressPercentage de erişebilirsiniz. Birden çok zaman uyumsuz işlem bekliyorsa, hangi işlemin artımlı sonuçları bildirdiğini ayırt etmek için özelliğini kullanabilirsiniz UserState .

Ayrıca bkz.