Tôi có câu hỏi về cơ chế hủy một hoạt động không đồng bộ đang diễn ra có thể được sử dụng, thay vào đó là mã thông báo hủy trong ngữ cảnh không đồng bộ/chờ đợi. Tôi chắc chắn đây là một quyết định thiết kế được nghiên cứu kỹ tính đến tính chất bắt buộc của ngôn ngữ, nhưng trong các tình huống thực tế phải vượt qua một đối tượng hủy bỏ cho tất cả các phương pháp async của bạn, ít nhất, một chút đau đớn. Có một ý tưởng thiết kế khác từ cộng đồng C#, hoặc cơ chế hủy bỏ đề xuất chỉ là OK? Tôi nghĩ rằng tôi đang thiếu một cái gì đó.cơ chế hủy không đồng bộ/chờ đợi
Trả lời
Mã thông báo hủy là phương pháp hay nhất, đặc biệt khi quá trình không đồng bộ tốn kém, không có điều kiện kết thúc đặt trước hoặc liên quan đến tài nguyên bên ngoài.
Tuy nhiên, bạn có thể, nếu bạn muốn, chỉ cần "từ bỏ". Thay vì nói chuỗi không đồng bộ để hủy bỏ quá trình xử lý và dọn dẹp, chỉ cần "hết giờ"; ngừng chờ đợi cho nó để hoàn thành, tách bất kỳ người nghe, và tiếp tục chạy. Khi luồng cuối cùng hoàn thành, nó sẽ kiểm tra sự kiện của nó, nhận ra không có ai nghe, và âm thầm chấm dứt. Ngược ở đây là sự đơn giản, tuy nhiên có nhiều tình huống mà điều này sẽ là một điều BAD:
- Nếu quá trình async sẽ tiếp tục xử lý mãi mãi trừ khi bạn yêu cầu dừng lại, nó sẽ tiếp tục chạy ở chế độ nền, cân bằng up CPU và các tài nguyên khác, cho đến khi ứng dụng được đóng lại, lúc đó thread sẽ bị giết.
- Nếu chuỗi không đồng bộ đang thực hiện một đơn vị hoạt động có thể hủy bỏ, có thể đảo ngược, chẳng hạn như thao tác DB, nếu người dùng nhấn hủy, họ mong đợi bất kỳ điều gì được thực hiện cho đến nay đã được khôi phục. Nếu bạn ngừng lắng nghe và tiếp tục, những gì họ sẽ nhận được là những gì họ nghĩ rằng họ hủy bỏ đã được thực hiện.
- Trong hầu hết các trường hợp, các hoạt động không đồng bộ liên quan đến tài nguyên bên ngoài cần có thời gian để làm việc và cũng yêu cầu dọn dẹp thích hợp. Ổ cắm mạng phải được ngắt kết nối, kết nối DB đóng, mở khóa, vv Mặc dù từ bỏ nghĩa là bạn không phải đối phó với điều đó, thay vào đó cho phép kết thúc bình thường, trải nghiệm người dùng phổ biến là cho người dùng bị chán, nhấn hủy và sau đó thử lại thao tác. Điều đó có nghĩa là tài nguyên bạn đã sử dụng trong hoạt động async trước đó phải được phát hành để sử dụng lại nó.
Để hủy hoạt động không đồng bộ có ý nghĩa, thao tác đó phải thực hiện các bước kín đáo, vì nó đang hoạt động để kiểm tra mã thông báo hủy và ngừng tự tiếp tục. I E. mã thông báo hủy chỉ là một mẫu được triển khai chứ không phải là cơ chế của async/await. Điều đó có nghĩa là nếu hoạt động không đồng bộ của bạn chỉ là một cuộc gọi I/O với một xử lý hoàn thành, bạn cũng có thể, chỉ cần bỏ hơn là hủy, vì hoạt động sẽ không có oppurtunity để kiểm tra mã thông báo của bạn cho đến khi cuộc gọi đó trở lại vào thời điểm đó không có gì để đạt được. Vì vậy, khi xem xét mã thông báo hủy, trước tiên hãy xem xét liệu hoạt động này có thể được thực hiện hiệu quả hơn bằng cách hỗ trợ hủy hay không chờ đợi hoàn thành (tức là sử dụng cơ chế thời gian chờ thay thế).
- 1. Cố gắng hiểu cơ chế của một hàng đợi đồng bộ
- 2. Hủy cuộc gọi EJB không đồng bộ @
- 3. Đợi phương thức không đồng bộ void
- 4. .NET HTTPClient Hạn chế không đồng bộ
- 5. hủy bỏ hàng đợi thực hiệnSelector: afterDelay gọi
- 6. Có thể hủy bỏ XmlHttpRequest đồng bộ không?
- 7. Hủy tác vụ truy xuất URL không đồng bộ
- 8. Đang đợi nhiều yêu cầu POST không đồng bộ
- 9. Đệ quy và từ khóa chờ đợi/không đồng bộ
- 10. Hàng đợi tập hợp đồng thời
- 11. Đồng bộ hóa một Hàng đợi
- 12. Hàng đợi chặn đồng bộ pthread
- 13. chế biến đồng thời/Các yêu cầu không đồng bộ với Python BaseHTTPServer
- 14. Không đồng bộ/chờ đợi trong vai trò công nhân xanh làm cho vai trò tái chế
- 15. Tạo và hủy các lớp AVFoundation trên hàng đợi nền?
- 16. Đồng bộ Đợi tin nhắn trong Web-Worker
- 17. cách bật yêu cầu chế độ không đồng bộ?
- 18. Hạn chế các cuộc gọi không đồng bộ trong Node.js
- 19. Làm thế nào để hủy đọc/ghi không đồng bộ mà không đóng chốt?
- 20. Đang đợi nhiều cuộc gọi không đồng bộ để hoàn thành trước khi tiếp tục
- 21. Đợi công việc không đồng bộ mà không bao gồm ngoại lệ trong AggregateException
- 22. Có thể đợi các tác vụ không đồng bộ trong khi nhấp vào nút không?
- 23. C# không đồng bộ, đang chờ đợi mà không có nhiệm vụ
- 24. Có phải chờ đợi thực hiện phần còn lại của phương thức không đồng bộ không?
- 25. Hàng đợi ưu tiên có thể thay đổi đồng thời
- 26. Hàng đợi đồng thời và chặn trong Java
- 27. Kết nối cơ sở dữ liệu không đồng nhất
- 28. Hàng đợi đồng thời với GCD? (IOS 4.2.1)
- 29. Truy cập cơ sở dữ liệu đồng bộ và không đồng bộ
- 30. async/chờ đợi với tham số continueOnCapturedContext ConfigureAwait và SynchronizationContext cho continuations không đồng bộ
Cơ chế hủy bằng mã thông báo hủy có vẻ là hướng mà mọi thứ được hướng đến, bao gồm cả C# 5 CTP trên Async. http://msdn.microsoft.com/en-us/vstudio/gg316360. Nó không gọi C# 5 nhưng tôi đang sử dụng nó ở đây để chỉ ra phiên bản "tiếp theo" của C#. –
Chỉ cần nhận thấy bạn đã sử dụng "đang chờ đợi" trong câu hỏi của mình để bạn quen thuộc với CTP. Tôi nghĩ rằng các thư viện công tác song song (.NET 4) loại xác nhận rằng các cơ sở nó cung cấp là con đường để đi và vì vậy các CTP Async sử dụng cùng một mô hình. –
Liên quan: http://stackoverflow.com/q/4914374/60761 –