Có hiệu quả đểSpinWait vs Sleep đang chờ. Mà một trong những sử dụng?
SpinWait.SpinUntil(() => myPredicate(), 10000)
cho một thời gian chờ của 10000ms
hoặc
Có hiệu quả hơn để sử dụng Thread.Sleep
bỏ phiếu cho cùng một điều kiện Ví dụ một cái gì đó dọc theo dòng trong các cách sau SleepWait
chức năng:
public bool SleepWait(int timeOut)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (!myPredicate() && stopwatch.ElapsedMilliseconds < timeOut)
{
Thread.Sleep(50)
}
return myPredicate()
}
Tôi là con cerned rằng tất cả các năng suất của SpinWait có thể không phải là một mô hình sử dụng tốt nếu chúng ta đang nói về thời gian chờ trên 1 giây? Đây có phải là giả định hợp lệ không?
Bạn thích phương pháp nào và tại sao? Có cách tiếp cận nào tốt hơn nữa không?
Cập nhật - Trở thành cụ thể hơn:
Có cách nào để làm cho BlockingCollection xung a thread ngủ khi nó đạt đến khả năng bị chặn? Tôi thích tránh một sự bận rộn chờ đợi như thường lệ như Marc Gravel gợi ý.
Cảm ơn, tôi thích câu trả lời của bạn, điều này sẽ rất tuyệt. Giả sử bạn đang theo dõi việc sử dụng một số tài nguyên thông qua một BlockingCollection. Chúng được sử dụng (và bị xóa khỏi bộ sưu tập) và quay trở lại bộ sưu tập khi chúng có sẵn một lần nữa để tái sử dụng. Việc tắt máy chỉ có thể xảy ra khi tất cả những thứ này đã trở lại bộ sưu tập. Làm thế nào bạn sẽ đi về báo hiệu rằng một tắt máy có thể đi trước (tức là bộ sưu tập là đầy đủ một lần nữa) khác hơn là chờ đợi bận rộn? – Anastasiosyal
@Anastasiosyal Tôi sẽ đóng gói bộ sưu tập và có trình bao bọc làm điều gì đó khi đầy; thực tế, tôi có thể sử dụng một 'Monitor' cho điều này (sẽ thêm ví dụ) –
Trong destructor của một lớp 'ObjectPool' xuống từ BlockingQueue, pop tất cả các đối tượng từ BlockingCollection từng cái một và vứt bỏ chúng, (vì đây là C#, đặt tham chiếu đã truy xuất về nil), cho đến khi số lượng đối tượng xuất hiện bằng độ sâu của hồ bơi. Tất cả các đối tượng gộp lại sau đó đã được xử lý, vì vậy bạn có thể vứt bỏ hàng đợi và trở về từ dtor để tiếp tục trình tự tắt máy. Không yêu cầu bỏ phiếu/bận rộn! Bạn có thể muốn đặt một số thời gian chờ trên mất để một đối tượng bị rò rỉ cuối cùng tăng một ngoại lệ, (hoặc một cái gì đó). –