2011-02-07 77 views
6

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

+0

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#. –

+0

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. –

+0

Liên quan: http://stackoverflow.com/q/4914374/60761 –

Trả lời

4

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ó.
1

Để 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ế).

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