2010-11-03 24 views
8

Theo tài liệu MSDN, Set() và Reset() trên ManualResetEvent (hoặc bất kỳ EventWaitHandle) trả về một chỉ báo boolean cho dù hoạt động có thành công hay không.Khi nào có thể ManualResetEvent.Set() trả về false?

Trong trường hợp nào, cuộc gọi này có thể trả về false và tôi phải làm gì nếu có?

Trả lời

15

Tôi đã không chắc chắn làm thế nào để trả lời điều này và nhìn vào rất nhiều ví dụ MSDN đặt trở lại giá trị được bỏ qua vì vậy nó không phải là quan trọng hoặc có khả năng xảy ra.

Nhưng điều đó không đủ tốt. Tôi bắn máy ảo của mình lên và tôi mở Reflector để xem mã. ManualResetEvent không có Set nhưng nó kế thừa từ EventWaitHandle. Dưới đây là các mã:

public bool Set() 
{ 
    bool flag = Win32Native.SetEvent(base.safeWaitHandle); 
    if (!flag) 
    { 
     __Error.WinIOError(); 
    } 
    return flag; 
} 

đâu SetEvent được nhập khẩu từ Kernel32:

[DllImport("kernel32.dll", SetLastError=true)] 
internal static extern bool SetEvent(SafeWaitHandle handle); 

Các WinIOError() gọi chỉ gọi GetLastWin32Error mà chúng tôi chưa thực sự quan tâm. Về cơ bản, điều này có nghĩa là cho cuộc gọi trả về false, một cái gì đó khá sai sẽ phải xảy ra trong mã nguồn gốc Win32.

Đưa thông tin này cùng với thực tế là mã được lưu trữ trong tài liệu MSDN chính thức bỏ qua giá trị trả về (tại sao không? Bạn sẽ làm gì nếu hạt nhân bị lỗi?) Bạn có thể an toàn bỏ qua nó nếu bạn muốn làm sạch logic của bạn lên một chút hoặc nhận được nó và đăng nhập nó nếu bạn đặc biệt là pedantic.

+2

Câu trả lời được nghiên cứu kỹ. +1 – spender

+0

Cảm ơn! Đó là một câu hỏi thú vị và nó khiến tôi tò mò. –

+1

Cảm ơn Erik. Lấy cảm hứng từ công việc của bạn, tôi đã làm điều tương tự và mở ra Reflector. Dường như WinIOError() sẽ luôn luôn ném một ngoại lệ cố gắng đại diện cho mã lỗi Win32 trong thế giới .NET, điều này có ý nghĩa - nhưng vẫn không thực sự giải thích tại sao cuộc gọi lại có giá trị trả về! – SoftMemes

0

Tôi không chắc chắn rằng chỉ cần đăng nhập lỗi và tiếp tục thực hiện sẽ là đủ. Kết quả sai từ Set() có thể mang lại hành vi sai trong chủ đề đồng bộ hóa được quản lý bởi các trình xử lý chờ. Đó là đa luồng ... Tầm nhìn của tôi về xử lý sai Set() kết quả - ném ngoại lệ, mà có lẽ trong hầu hết các trường hợp có thể được unhandled.

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