2013-08-13 14 views
6

Một trong những điều thú vị về C# 5.0 là từ khóa async/await và cách nó đơn giản hóa hệ thống ống nước bạn đã từng phải viết với Thư viện song song nhiệm vụ (TPL).Có cách nào để buộc async/đang chờ để tiếp tục chuỗi đầu tiên có sẵn không?

Câu hỏi của tôi là nếu bạn có mã không xác định chủ đề và bạn sẽ kích hoạt hoạt động không đồng bộ trên chuỗi chính (đọc: chuỗi giao diện người dùng), nhưng bạn không nhất thiết phải quan tâm việc tiếp tục diễn ra trên chuỗi chính hay không bạn nói với mô hình async/await mà bạn muốn nó tiếp tục trên chuỗi có sẵn đầu tiên, ngay cả khi nó không phải là chủ đề chính?

Tôi nghĩ rằng việc có thể làm được điều này sẽ làm tăng hiệu quả của một số trường hợp nhất định, chứ không phải là một viên đạn bạc.

+2

Lưu ý rằng khả năng này rất quan trọng đối với chức năng thích hợp trong một số trường hợp nhất định, không chỉ hiệu quả. Bạn có thể tránh gây ra deadlocks bằng cách đảm bảo rằng một số tiếp tục không chạy trong bối cảnh đã capture. – Servy

Trả lời

15

Nếu bạn không quan tâm nơi phần còn lại của phương pháp này tiếp tục, sử dụng Task.ConfigureAwait:

await foo.DoSomethingAsync().ConfigureAwait(continueOnCapturedContext: false); 

(Bạn không sử dụng một đối số được đặt tên ở đây, nhưng nó làm tăng độ rõ nét.)

Xem phần "Định cấu hình ngữ cảnh" của Stephen Cleary's "best practices" article để biết thêm chi tiết.

+0

Ouch, nhưng theo một cách tốt. :) Ý tôi là: Tôi đã viết bài báo đó, nhưng nó tâng bốc mà bạn cho rằng nó có chất lượng. –

+0

@StephenCleary: Rất tiếc, xin lỗi. Tôi đã tìm kiếm "Stephen Toub thực hành tốt nhất ConfigureAwait" và thấy rằng - sau đó đã không kiểm tra quyền tác giả. Lời xin lỗi sâu sắc! (Tôi chắc rằng mình đã thấy một bài viết khác * thực sự * của Toub về nó ...) –

Các vấn đề liên quan