Sau khi ứng dụng của tôi bị đóng băng, tôi đã theo dõi nguyên nhân của một chuỗi đang chờ trên một tác vụ được tạo bởi Task.Delay()
(hoặc TaskEx.Delay()
trong .NET 4.0) mà nó đã cung cấp tính toán TimeSpan
, do lỗi, được tính vào số TimeSpan
với số TotalMilliseconds
nhỏ hơn hoặc bằng -1
và lớn hơn -2
(ví dụ: bất kỳ vị trí nào trong khoảng từ -10000 đến -19999 bọ ve).Tại sao Task.Delay() cho phép trì hoãn vô hạn?
Dường như khi bạn vượt qua một tiêu cực TimeSpan
đó là -2
mili giây hoặc thấp hơn, phương pháp này một cách chính xác ném một ArgumentOutOfRangeException
, nhưng khi bạn cung cấp một TimeSpan tiêu cực từ dòng sản phẩm được mô tả ở trên, nó sẽ trả về một Task
mà không bao giờ hoàn thành (bằng cách thiết lập bên dưới System.Threading.Timer
đến một số dueTime
trong số -1 biểu thị vô cùng). Điều đó có nghĩa là bất kỳ sự tiếp tục nào được đặt trên tác vụ đó sẽ không bao giờ thực hiện và bất kỳ chuỗi kém nào xảy ra với .Wait()
trên đó Task
sẽ mãi mãi bị chặn.
Điều gì có thể sử dụng có thể là Task
mà không bao giờ hoàn thành? Có ai mong đợi một giá trị trả lại như vậy không? Không nên có bất kỳ giá trị âm nào được chuyển đến .Delay()
, bao gồm các giá trị trong phạm vi đặc biệt đó, hãy ném một số ArgumentOutOfRangeException
?
Tài liệu MSDN khá rõ ràng khi cho phép -1, do đó, có vẻ như hoạt động chính xác. Không chắc chắn về trường hợp sử dụng cho tình trạng quá tải đó, nhưng nó có thể là một cách chờ đợi 'hủy bỏ' chỉ với quá tải phải mất mã thông báo hủy. –
@James: Không rõ ràng khi cho phép -1, rõ ràng là không cho phép giá trị thấp hơn -1. Nó thậm chí không nói điều gì sẽ xảy ra nếu bạn vượt qua -1, không giống như tài liệu của 'System.Threading.Timer'. Nó gần như xuất hiện như danh sách tài liệu ngoại lệ được tự động tạo ra từ mã nguồn. Và nếu bạn đang chờ đợi 'hủy bỏ' chỉ, tại sao thậm chí thực hiện một cuộc gọi đến 'Task.Delay()'? –
nếu bạn nghĩ rằng nó bị hỏng, hãy gửi một lỗi khi kết nối. Một tài liệu cho biết "thấp hơn -1 là không hợp lệ" là rõ ràng (với tôi) khi nói rằng -1 là hợp lệ. Nếu mục đích là -1 là không hợp lệ "thấp hơn 0 không hợp lệ" sẽ dễ viết hơn. Vì doc và code đều cho phép -1, tôi nghĩ đây là By Design, nhưng hãy thoải mái gửi một lỗi về kết nối (nhiều khả năng được xử lý bởi nhóm BCL hơn là một chuỗi SO ngẫu nhiên, tôi sẽ nghĩ :) –