BackgroundWorker vs. Async / Menunggu

16

Saya baru mengenal pengembangan C # dan ingin membuat UI yang lebih responsif. Dalam penelitian pendahuluan saya, saya telah melihat dua metode untuk mencapai ini:

  1. Multi-threading bersamaan dengan kelas BackgroundWorker.
  2. Pengubah Async / Await yang lebih baru.

Apakah yang lebih baru berarti lebih baik? Apa perbedaan antara kedua metode ini? Jika saya ingin membuat proyek baru, bagaimana cara memilih metode mana yang cocok?

EDIT: Mungkin saya harus menentukan. Saya membuat aplikasi Windows Forms, di mana semua data yang diperlukan akan disimpan / dimuat pada disk lokal. Saya juga akan berkomunikasi dengan beberapa perangkat USB.

robert.ecot
sumber

Jawaban:

10

Anda akan dapat menyelesaikan tugas Anda menggunakan BackgroundWorker. Ini adalah kelas yang terkenal, dan banyak orang telah menggunakannya.

C # 5 asyncdan awaitkata kunci baru pada dasarnya hanya membuatnya lebih mudah untuk menulis kode asinkron yang dapat dibaca. Mungkin ada lebih sedikit tutorial dan contoh cara menyelesaikan berbagai tugas dengan kata kunci ini daripada BackgroundWorker.

Kecuali jika Anda perlu menggunakan versi C # yang lebih lama, saya sarankan mempelajari cara menggunakan asyncdan await.

M. Dudley
sumber
13

Kata kunci asyncdan awaittidak akan membuat aplikasi Anda lebih responsif sendiri. Mereka hanya membuat panggilan dan penanganan metode yang mengembalikan Taskobjek lebih nyaman. Untuk membuat async/ awaitbenar-benar menggunakan utas latar belakang, Anda harus menggabungkan dengan penggunaan hal-hal seperti:

  • Task.Start()- Mulai tugas yang diberikan menggunakan TaskScheduler.
  • PLINQ - Menjalankan serangkaian operasi secara paralel, mengembalikan Tugas.
  • TaskCompletionSource- Cara kustom untuk menangani tugas-tugas async. Satu tempat saya menggunakan ini adalah untuk menangani acara yang berasal dari WebBrowserkontrol.
  • asyncMetode lain , seperti banyak fungsi di Win 8 API.

Dengan kata lain, async/ awaitadalah perpanjangan dari Pola Asinkron Berbasis Tugas . Anda dapat menemukan sejumlah besar informasi, termasuk banyak sampel, di sini .

Ini BackgroundWorkeradalah komponen WinForms yang membuat 1 utas latar belakang menggunakan pola Asynchronous Berbasis Kejadian , dan Anda dapat mengisi pekerjaan yang dilakukan pada utas latar belakang ini dengan kode Anda sendiri di DoWorkpengendali acara. Secara umum, Microsoft tidak lagi merekomendasikan untuk menggunakan pola ini (lihat bagian bawah halaman di sini ), meskipun jika Anda sudah mengenalnya, itu mungkin masih merupakan opsi sederhana.

Pilihan lain yang tidak disebutkan, adalah ekstensi reaktif untuk .NET . Ini adalah kerangka kerja hebat lainnya untuk menambahkan daya tanggap ke aplikasi Anda.

Kevin McCormick
sumber
Ketika Anda mengatakan Win 8 API, apakah itu menyiratkan fitur Async tidak didukung dengan baik pada Windows 7 (platform target saya)?
robert.ecot
1
Halo Robert, Win 8 .NET API (untuk aplikasi gaya "Metro") menggunakan async dan menunggu semuanya untuk mulai dari File I / O hingga menampilkan kotak dialog. Dalam komponen .NET lainnya, misalnya, FileStream, Anda juga dapat menggunakan async / menunggu dengan metode seperti Stream.ReadAsync. Jadi ada beberapa dukungan di luar Win 8 juga.
Kevin McCormick
Hebat, dan terima kasih atas tautan yang diperbarui juga! Sangat membantu.
robert.ecot
1
Saya tidak melihat apa pun di halaman itu yang menunjukkan bahwa BackgroundWorker, secara khusus, disarankan untuk tidak.
Kyralessa
Saya juga merekomendasikan pembacaan Async VS BackgroundWorker dan serangkaian posting blog tentang pemrograman bersamaan di C # dari Stephen Clearly, penulis buku omonim yang diterbitkan oleh O'Reilly.
Sentenza
3

Saya akan mengatakan bahwa async- awaitjauh lebih fleksibel daripada BackgroundWorker. Dan jika Anda ingin melakukan sesuatu yang cocok BackgroundWorker, Anda dapat melakukannya dengan async- awaitjuga, dengan kode yang lebih mudah dibaca dan lebih aman.

Karena itu, saya pikir Anda sebaiknya memilih async- awaitover BackgroundWorker.

svick
sumber