BackgroundWorker so với Async / Await


16

Tôi chưa quen với việc phát triển C # và muốn tạo một giao diện người dùng nhạy hơn. Trong nghiên cứu sơ bộ của tôi, tôi đã thấy hai phương pháp để đạt được điều này:

  1. Đa luồng kết hợp với lớp BackgroundWorker.
  2. Các sửa đổi Async / Await mới hơn.

Có mới hơn có nghĩa là tốt hơn? Sự khác biệt giữa hai phương pháp là gì? Nếu tôi muốn tạo một dự án mới, làm thế nào để tôi chọn phương pháp nào để đi cùng?

EDIT: Có lẽ tôi nên chỉ định. Tôi đang tạo một ứng dụng Windows Forms, nơi tất cả dữ liệu cần thiết sẽ được lưu / tải trên đĩa cục bộ. Tôi cũng sẽ liên lạc với một số thiết bị USB.


Câu trả lời:


10

Bạn sẽ có thể hoàn thành nhiệm vụ của bạn bằng cách sử dụng BackgroundWorker. Đó là một lớp học nổi tiếng, và nhiều người đã sử dụng nó.

C # 5 mới asyncawaitcác từ khóa về cơ bản chỉ giúp việc viết mã không đồng bộ dễ đọc trở nên dễ dàng hơn. Có thể có ít hướng dẫn và ví dụ về cách hoàn thành các nhiệm vụ khác nhau với các từ khóa này hơn là BackgroundWorker.

Trừ khi bạn cần sử dụng phiên bản cũ hơn của C #, tôi khuyên bạn nên học cách sử dụng asyncawait.


13

Các từ khóa asyncawaitsẽ không làm cho ứng dụng của bạn phản ứng nhanh hơn. Chúng chỉ đơn giản làm cho việc gọi và xử lý các phương thức trả về Taskcác đối tượng thuận tiện hơn. Để thực hiện async/ awaitthực sự sử dụng các chủ đề nền, bạn sẽ cần kết hợp với việc sử dụng những thứ như:

  • Task.Start()- Bắt đầu một nhiệm vụ nhất định bằng cách sử dụng TaskScheduler.
  • PLINQ - Thực hiện song song một loạt các hoạt động, trả về một Nhiệm vụ.
  • TaskCompletionSource- Một cách tùy chỉnh để xử lý các tác vụ không đồng bộ. Một nơi tôi đã sử dụng điều này là để xử lý các sự kiện đến từ một WebBrowserđiều khiển.
  • Các asyncphương pháp khác , chẳng hạn như nhiều chức năng trong API Win 8.

Nói cách khác, async/ awaitlà một phần mở rộng của Mẫu không đồng bộ dựa trên tác vụ . Bạn có thể tìm thấy một lượng lớn thông tin, bao gồm nhiều mẫu ở đây .

Thành BackgroundWorkerphần WinForms tạo 1 luồng nền bằng cách sử dụng mẫu Không đồng bộ dựa trên sự kiện và bạn có thể điền công việc được thực hiện trên luồng nền này bằng mã của riêng bạn trong DoWorktrình xử lý sự kiện. Nói chung, Microsoft không còn khuyến nghị sử dụng mẫu này (xem phần dưới cùng của trang ở đây ), mặc dù nếu bạn đã quen với nó thì đây vẫn có thể là một tùy chọn đơn giản.

Một tùy chọn khác không được đề cập, là phần mở rộng Reactive cho .NET . Đây là một khuôn khổ tuyệt vời khác để thêm khả năng phản hồi cho các ứng dụng của bạn.


Khi bạn nói API Win 8, điều đó có nghĩa là các tính năng Async không được hỗ trợ tốt trên Windows 7 (nền tảng mục tiêu của tôi) không?
robert.ecot

1
Xin chào Robert, API Win 8 .NET (dành cho ứng dụng kiểu "Metro") sử dụng async và chờ đợi rất nhiều cho tất cả mọi thứ từ Tệp I / O đến hiển thị hộp thoại. Trong các thành phần .NET khác, ví dụ như FileStream, bạn cũng có thể sử dụng async / await với các phương thức như Stream.ReadAsync. Vì vậy, có một số hỗ trợ bên ngoài Win 8, quá.
Kevin McCormick

Tuyệt vời, và cảm ơn cho các liên kết cập nhật quá! Rất hữu ích.
robert.ecot

1
Tôi không thấy bất cứ điều gì trên trang đó chỉ ra rằng BackgroundWorker, cụ thể, được khuyến nghị chống lại.
Kyralessa

Tôi cũng khuyên bạn nên đọc Async VS BackgroundWorkerloạt bài đăng trên blog về lập trình đồng thời trong C # của Stephen Clearly, tác giả của cuốn sách ẩn danh được xuất bản bởi O'Reilly.
sentenza

3

Tôi muốn nói rằng async- awaitlinh hoạt hơn nhiều BackgroundWorker. Và nếu bạn muốn làm một cái gì đó phù hợp BackgroundWorker, bạn cũng có thể làm điều đó với async- awaitvới mã dễ đọc hơn và an toàn hơn.

Do đó, tôi nghĩ bạn nên sử dụng hơn async- awaithơn BackgroundWorker.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.