2010-07-22 46 views
32

Tôi có WaitHandle và tôi muốn biết cách kiểm tra xem WaitHandle đã được đặt hay chưa.Cách kiểm tra xem WaitHandle đã được đặt chưa?

Lưu ý: Tôi có thể thêm biến bool và bất cứ khi nào phương thức Set() được sử dụng đặt biến thành true, nhưng hành vi này phải được xây dựng trong WaitHandle ở đâu đó.

Cảm ơn bạn đã trợ giúp!

+0

câu trả lời của tôi là chỉ cần vài giây trước khi SwDevMan của đó là rõ ràng hơn nhiều và bao gồm các tài liệu hướng dẫn báo giá, vì vậy tôi đang xóa nó. Tuy nhiên, tôi vẫn tự hỏi "Bạn đang xử lý sự kiện đặt lại tự động có thể đã được đặt lại hay mã kiểm tra không được đặt lại?" –

Trả lời

47

Hãy thử WaitHandle.WaitOne(0)

Nếu millisecondsTimeout là zero, phương pháp này không chặn. Nó kiểm tra trạng thái chờ xử lý và trả về ngay lập tức.

+1

* Xấu hổ * Cảm ơn! –

+0

+1 Câu trả lời rõ ràng. Đẹp và đơn giản, mặc dù tôi sẽ đề nghị thay đổi "Try" thành "Use". Khi nó đứng, bạn dường như không chắc chắn về câu trả lời của bạn. –

+3

Vấn đề duy nhất là đối với một số WaitHandles (sự kiện tự động thiết lập lại, semaphore), trạng thái sẵn sàng thực sự sẽ được thiết lập lại bằng cách chờ đợi nó. –

2

Sử dụng một trong những phương pháp trên Wait...WaitHandle mà phải mất một giá trị thời gian chờ, như WaitOne, và vượt qua một thời gian chờ của 0.

1

Bạn có thể sử dụng phương pháp WaitOne(int millisecondsTimeout, bool exitContext) và vượt qua trong 0 cho khoảng thời gian. Nó sẽ trở lại ngay lập tức.

bool isSet = yourWaitHandle.WaitOne(0, true); 
+0

Tại sao họ nên sử dụng báo giá có giá trị 'exitContext'? Xem xét rằng có những lựa chọn thay thế mà không yêu cầu lĩnh vực này, bạn nên giải thích sự cần thiết của nó. –

+0

Trợ giúp trực tuyến cho VS2005 chỉ hiển thị WaitOne(), WaitOne (int, bool) và WaitOne (TimeSpan, bool). Vì vậy, có thể họ không tìm thấy WaitOne (int) –

5
const int DoNotWait = 0; 

ManualResetEvent waitHandle = new ManualResetEvent(false);     

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait)); 

waitHandle.Set(); 

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait)); 

Output:

là thiết lập: False

Được thiết: True

+0

Tại sao lại sử dụng từ khóa cho biến? Nó không cần thiết và làm cho câu trả lời của bạn khó đọc hơn. –

+0

@ Jeff Chắc chắn, nó chỉ là một điều khó khăn để đặt tên cho một số mã mẫu, và tôi đã viết rất nhiều mã ngày hôm nay. –

+0

@chibacity: thật dễ dàng để viết một cái gì đó khác ngoài sự kiện. 'waitHandle',' resetEvent', 'mre',' myEvent'. Danh sách là vô tận và nó sẽ làm cho ví dụ của bạn tốt hơn. –

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