Thứ nhất, tôi không hỏi cùng một câu hỏi như C# - Alternative to Thread.Sleep? hoặc Alternative to Thread.Sleep in C#?. Tôi không nghĩ rằng tôi đang sử dụng nó không chính xác và cần một sự thay thế chính hãng cho các tình huống cụ thể.Cách khác để sử dụng Thread.Sleep để chờ
Trong một hoạt động phân tích mã tôi thấy một sự vi phạm bất ngờ sắp tới:
Sử dụng Thread.Sleep() là một dấu hiệu của thiết kế sai lầm.
Vi phạm này dẫn đến Peter Richie's article về lý do chính xác điều này cấu thành thiết kế kém.
Chúng ta đều biết tạo luồng là tốn kém và chặn trong chuỗi có nghĩa là tranh chấp trên hồ bơi. Chúng tôi cũng biết rằng mỗi luồng sẽ phân bổ một meg bộ nhớ vì vậy nó sẽ có tuổi thọ ngắn, chặn trên giao diện người dùng là điều ác, sử dụng thời gian ngủ là không đáng tin cậy, v.v. v.v. Điều này dẫn tôi đến điểm của tôi, nếu bạn thực sự cần thực hiện một giấc ngủ, những gì bạn nên sử dụng nếu không Thread.Sleep?
Peter tiếp tục đề cập đến rằng giấc ngủ bằng 0 là cách sử dụng chính xác nhất của Thread.Sleep có hiệu quả từ bỏ thời gian của chuỗi và cho phép các luồng khác xử lý. Và thậm chí đáng sợ hơn nữa là đây chỉ là một hạn chế về các luồng không được quản lý và nếu được tái triển khai trong CLR sẽ tạo ra các tác dụng phụ của việc sử dụng Thread.Sleep trong các ứng dụng của bạn. Tất cả các điểm về sử dụng phổ biến xấu, trên thực tế, ví dụ tốt về sử dụng xấu.
Tôi có các tình huống sau đây trong mã sản xuất có sử dụng Thread.Sleep khá thành công:
- Chờ một khóa tập tin để xin trả lại bởi hệ điều hành (vấn đề khóa tập tin bắt, chờ đợi trong giây lát , thử lại, bỏ cuộc sau một lúc).
- Giết một quy trình và chờ nó không hiển thị trong danh sách quá trình (hãy xóa nó, kiểm tra nó không chạy, đợi giây thứ hai, kiểm tra nó vẫn chưa chạy, buộc đóng).
- Đang chờ bộ đệm sao chép tuôn ra (kiểm tra kích thước tệp, hãy thử truy cập bộ đệm, chờ, kiểm tra xem kích thước đã thay đổi) chưa.
Không sử dụng Thread.Sleep trong các tình huống như thế này, tôi có những tùy chọn nào khác? Các vòng chặt chẽ có xu hướng làm mọi việc tồi tệ hơn và tôi không tin điều này làm cho nó sử dụng "lỗi thiết kế" đặc biệt là vì không có gì trên giao diện người dùng và chỉ trong các chủ đề nền. Nó chỉ là bản chất của phần mềm để chờ đợi những thứ khác trong môi trường đa luồng với các yếu tố bên ngoài ảnh hưởng đến mã của bạn, đôi khi bạn cần phải chờ ...
nào bạn muốn nói, Thread.Sleep gì là không thể tránh khỏi? sau đó sử dụng nó. Nhưng tôi không bao giờ muốn sử dụng nó. – I4V
Trong khi bài viết của Peter có nhiều điểm tốt, nó không lý do thực tế là nó chỉ đơn giản là sai. –