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.
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 için BackgroundWorker bileşeni kolay bir çözüm sunar. 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.
Kaynakların kullanılabilir olmasını, uygulamanızı engellemeden bekleyin.
Tanıdık olaylar ve temsilciler modelini kullanarak bekleyen asenkron 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 MethodNameCompleted olayı da olabilir ve MethodNameAsyncCancel (veya yalnızca CancelAsync) yöntemi olabilir.
PictureBox , Olay Tabanlı Zaman Uyumsuz Deseni destekleyen tipik bir bileşendir. Load yöntemini çağırarak bir resmi eşzamanlı olarak indirebilirsiniz, ancak resim büyükse veya ağ bağlantısı yavaşa, indirme işlemi tamamlanana ve Load çağrısı geri dönene kadar uygulamanız yanıt vermeyi durdurur.
Uygulamanızın görüntü yüklenirken çalışmaya devam etmesini istiyorsanız, diğer tüm olayları işlediğiniz gibi LoadAsync yöntemini çağırabilir ve LoadCompleted olayını işleyebilirsiniz. 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ı CancelAsync, bekleyen indirmeyi durdurma isteği gönderir ve görev LoadCompleted iptal edildiğinde olay tetiklenir.
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ı Asenkron Desen Örnekleri
SoundPlayer ve PictureBox bileşenleri, Olay Tabanlı Zaman Uyumsuz Desenin basit uygulamalarını temsil eder. WebClient ve BackgroundWorker bileşenleri, 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. Senkron 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ının tamamlanmasında fark edilebilir bir gecikme olabilir. Zaman uyumsuz aşırı yüklemeler işlemi başka bir iş parçacığında başlatır ve ardından hemen geri döner, bu arada işlem "arka planda" yürütülürken çağıran iş parçacığının devam etmesine izin verir.
Asenkron Yöntem Aşırı Yüklemeleri
Zaman uyumsuz işlemler için potansiyel olarak 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 Method1Async(string param) çağırmayı denerseniz, yöntem bir InvalidOperationException oluş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 userState nesnelerini (görev kimlikleri) takip etmesi gerekir. Her Method1Async(string param, object userState) çağrısı için, genellikle yeni ve benzersiz bir userState nesnesi 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.
Uyarı
Birden çok çağrı aşırı yüklemelerinizde userState için benzersiz bir değer sağlamaya dikkat etmeniz gerekir. Benzersiz olmayan görev kimlikleri, asenkron sınıfın bir ArgumentException oluşturmasına yol açar.
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 MethodNameAsyncCancel 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ştirmelerini 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 ProgressChangedProgressChanged olarak adlandırılır ve buna karşılık gelen olay işleyicisi bir ProgressChangedEventArgs parametre alır.
Olay ProgressChanged için olay işleyicisi, zaman uyumsuz bir görevin tamamlanma yüzdesini belirlemek amacıyla ProgressChangedEventArgs.ProgressPercentage özelliğini inceleyebilir. Bu özellik 0 ile 100 arasında değişir ve bir Value'in ProgressBar özelliğini güncellemek için kullanılabilir. Birden fazla zaman uyumsuz işlem bekliyorsa, hangi işlemin ilerleme durumunu bildirdiğini ayırt etmek için ProgressChangedEventArgs.UserState ö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.
ProgressChanged olayına ait işlemciye, tıpkı ProgressPercentage özelliğine erişebileceğiniz gibi, bu sonuçlara da erişebilirsiniz. Birden fazla zaman uyumsuz işlem beklemedeyse, hangi işlemin artımlı sonuçları bildirdiğini ayırt etmek için UserState özelliğini kullanabilirsiniz.
Ayrıca bakınız
- ProgressChangedEventArgs
- BackgroundWorker
- AsyncCompletedEventArgs
- Nasıl yapılır: Olay Tabanlı Zaman Uyumsuz Deseni Destekleyen Bileşenleri Kullanma
- Nasıl yapılır: Arka Planda İşlem Çalıştırma
- Nasıl Yapılır: Arka Plan İşlemi Kullanan Bir Formu Gerçekleştirme
- Olay Tabanlı Asenkron Model (EAP)
- Olay Tabanlı Zaman Uyumsuz Deseni Uygulamak için En İyi Yöntemler
- Olay Tabanlı Zaman Uyumsuz Desenin Ne Zaman Uygulanacaklarına Karar Verme