Async / Bekliyor


17

C # geliştirme konusunda yeniyim ve daha duyarlı bir kullanıcı arayüzü oluşturmak istiyorum. Ön araştırmamda, bunu başarmak için iki yöntem gördüm:

  1. BackgroundWorker sınıfıyla birlikte çoklu iş parçacığı oluşturma.
  2. Daha yeni Async / Await değiştiricileri.

Yeni olan daha iyi anlamına mı geliyor? İki yöntem arasındaki fark nedir? Yeni bir proje oluşturmak istersem, hangi yöntemin uygulanacağını nasıl seçerim?

EDIT: Belki belirtmeliyim. Gerekli tüm verilerin yerel diske kaydedileceği / yükleneceği bir Windows Forms uygulaması oluşturuyorum. Ayrıca birkaç USB cihazı ile iletişim kuracağım.


Yanıtlar:


10

Kullanarak görevinizi yerine getirebileceksiniz BackgroundWorker. İyi bilinen bir sınıf ve birçok insan onu kullandı.

Yeni C # 5 asyncve awaitanahtar kelimeler temel olarak okunabilir eşzamansız kod yazmayı kolaylaştırır. Bu anahtar kelimelerle değil, çeşitli görevleri nasıl yerine getireceğinize ilişkin daha az öğretici ve örnek olabilir BackgroundWorker.

Eğer C # eski bir sürümünü kullanmak gerekir sürece, kullanmayı öğrenmek öneririz asyncve await.


14

asyncVe awaitanahtar kelimeler, kendi üzerinde uygulama daha duyarlı yapmaz. TaskNesneleri daha rahat döndüren yöntemlerin çağrılmasını ve işlenmesini kolaylaştırırlar. Arka plan iş parçacıklarını yapmak async/ awaitkullanmak için, aşağıdakilerin kullanımı ile birleştirmeniz gerekir:

  • Task.Start()- Belirli bir görevi TaskScheduler.
  • PLINQ - Bir dizi işlemi paralel olarak yürütür, bir Görev döndürür.
  • TaskCompletionSource- Zaman uyumsuz görevleri işlemek için özel bir yol. Bunu kullandığım bir yer, bir WebBrowserkontrolden gelen olayları ele almaktı .
  • asyncWin 8 API'sindeki işlevlerin çoğu gibi diğer yöntemler.

Başka bir deyişle async/ await, Görev Tabanlı Eşzamansız Desenin bir uzantısıdır . Burada , birçok örnek de dahil olmak üzere geniş bir bilgi barındırıcısı bulabilirsiniz .

BackgroundWorkerKullanılarak 1 arkaplan parçacığı oluşturur WinForms bileşenidir Olay Tabanlı Asenkron desen ve kendi kodu ile bu arkaplan parçacığı üzerinde yapılan çalışmaları doldurabilirsiniz DoWorkolay işleyicisi. Genel olarak, Microsoft'un artık bu modeli kullanılmasını önerir (sayfanın altına bakınız burada onunla tanıdık olup olmadığını zaten bu çok kolay bir seçenek olabilir gerçi).

Bahsedilmeyen diğer bir seçenek, .NET için Reaktif Uzantılarıdır . Bu, uygulamalarınıza yanıt vermek için harika bir çerçevedir.


Win 8 API dediğinizde, Async özelliklerinin Windows 7'de (hedef platformum) iyi desteklenmediği anlamına mı geliyor?
robert.ecot

1
Merhaba Robert, zaman uyumsuz kullanarak Win 8 .NET API ("Metro" tarzı uygulamalar için) ve Dosya G / Ç'den iletişim kutularını göstermeye kadar her şeyi ağır bir şekilde bekliyor. FileStream gibi diğer .NET bileşenlerinde, Stream.ReadAsync gibi yöntemlerle async / await komutunu da kullanabilirsiniz. Yani Win 8 dışında da bazı destek var.
Kevin McCormick

Harika ve güncellenen bağlantılar için teşekkürler! Çok yararlı.
robert.ecot

1
Bu sayfada BackgroundWorker, özellikle tavsiye edilmediğini belirten hiçbir şey görmüyorum .
Kyralessa

Ben de okumanızı tavsiye ederim Async VS BackgroundWorker'ın ve O'Reilly tarafından yayınlanan anonim kitabın yazarı Stephen Clearly'nin C # 'da Eşzamanlı programlama hakkında bir dizi blog yazısı öneriyorum.
sentenza

3

Ben söyleyebilirim ki async- awaitçok daha esnektir BackgroundWorker. Ve uyan o bir şey yapmak istiyorsanız BackgroundWorker, sen bunu yapabilir async- awaitdaha okunabilir ve daha tip-güvenli kod ile de.

Bu nedenle, sana kullanmayı tercih gerektiğini düşünüyorum async- awaitover BackgroundWorker.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.