Tác vụ thay thế thư viện song song cho BackgroundWorker?


83

Thư viện song song nhiệm vụ có bất kỳ thứ gì được coi là thay thế hoặc cải tiến so với lớp BackgroundWorker không?

Tôi có một ứng dụng WinForms với giao diện người dùng kiểu thuật sĩ và nó thực hiện một số tác vụ lâu dài. Tôi muốn có giao diện người dùng đáp ứng với thanh tiến trình tiêu chuẩn và khả năng hủy hoạt động. Tôi đã làm điều này trước đây với BackgroundWorker, nhưng tôi tự hỏi liệu có một số mẫu TPL có thể được sử dụng thay thế không?


Câu trả lời:


91

Các Tasklớp học là một sự cải tiến so với BackgroundWorker; nó hỗ trợ lồng nhau một cách tự nhiên (nhiệm vụ mẹ / con), sử dụng API hủy mới, tính liên tục của nhiệm vụ, v.v.

Tôi có một ví dụ trên blog của mình , cho thấy BackgroundWorkercách làm cũ và cách làm mới Task. Tôi có một lớp trợ giúp nhỏ cho các tác vụ cần báo cáo tiến độ, bởi vì tôi thấy cú pháp khá khó xử. Ví dụ bao gồm các giá trị kết quả, điều kiện lỗi, hủy và báo cáo tiến độ.


Quyết định khó khăn giữa câu trả lời này và câu trả lời của Hatch vì về mặt kỹ thuật, câu trả lời của anh ấy là một câu trả lời đúng. Tuy nhiên, blog của bạn cho thấy cách sử dụng lớp Tác vụ mới và đó thực sự là những gì tôi đang tìm kiếm - một sự phát triển từ BackgroundWorker. Tôi đang sử dụng ví dụ của bạn làm cơ sở cho mã trong ứng dụng của tôi.
Keith G

2
Cách đây vài ngày, tôi đã viết một bài so sánh các kỹ thuật xử lý nền khác nhau . BackgroundWorkercó báo cáo tiến trình dễ dàng hơn, đồng thời Taskcho phép lồng vào nhau. Trong số hai, tôi thích hơn Task( dễ dàng hơn nhiều để xóa báo cáo tiến độ hơn là cho phép lồng nhau). Tuy nhiên, cả hai đều đi trước các giải pháp thông thường khác nhiều năm ánh sáng. Tôi quặn lòng khi nghe mọi người sử dụng Threadhoặc ThreadPool.QueueUserWorkItem. Chúng là tuyệt đối khó sử dụng chính xác cho các tác vụ nền.
Stephen Cleary

Báo cáo tiến độ dễ dàng hơn? Chỉ khi tất cả những gì bạn muốn báo cáo một tỷ lệ phần trăm. Báo cáo bất cứ điều gì khác đòi hỏi BeginInvoke hoặc SynchronizationContext.Post xấu xa
Panagiotis Kanavos

5
@PanagiotisKanavos: Bạn có thể chuyển bất kỳ đối tượng tùy ý nào dưới dạng userState. Tuy nhiên, trong 2,5 năm kể từ lần nhận xét cuối cùng của tôi, Taskđã được bổ sung IProgress<T>Progress<T>, những BackgroundWorkertiến bộ rõ ràng hơn và dễ dàng hơn . Trong mã hiện đại, không có lý do gì để sử dụng BackgroundWorkernữa.
Stephen Cleary

Vâng, tôi chỉ để ý. Bằng cách nào đó, bài đăng này xuất hiện hàng đầu khi tôi nhấp vào thẻ TPL để tìm câu hỏi mới!
Panagiotis Kanavos

23

Background worker vẫn là một cách hợp lệ để đạt được điều này - nếu bạn đang chạy nhiều hoạt động lớn đồng thời thì các phần mở rộng song song sẽ đáng xem xét, nếu nó chỉ là một thì tôi sẽ gắn bó với 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.