' by Daniel Moth (http://www.danielmoth.com/Blog/) Namespace System.Threading Public Class EventWaitHandle Inherits WaitHandle Public Shared Function OpenExisting(ByVal name As String) As System.Threading.EventWaitHandle Return New EventWaitHandle(Win32Api.OpenEvent(Win32Api.EVENT_ALL_ACCESS, False, name)) End Function Public Function Reset() As Boolean Return Win32Api.EventModify(Me.Handle, Win32Api.EventFlags.EVENT_RESET) End Function Public Function [Set]() As Boolean Return Win32Api.EventModify(Me.Handle, Win32Api.EventFlags.EVENT_SET) End Function Public Sub New(ByVal initialState As Boolean, ByVal mode As System.Threading.EventResetMode) Me.New(initialState, mode, Nothing) End Sub Public Sub New(ByVal initialState As Boolean, ByVal mode As System.Threading.EventResetMode, ByVal name As String) Me.New(Win32Api.CreateEvent(IntPtr.Zero, mode = EventResetMode.ManualReset, initialState, name)) End Sub Public Sub New(ByVal initialState As Boolean, ByVal mode As System.Threading.EventResetMode, ByVal name As String, ByRef createdNew As Boolean) Dim h As IntPtr = Win32Api.CreateEvent(IntPtr.Zero, mode = EventResetMode.ManualReset, initialState, name) If h.Equals(IntPtr.Zero) Then Throw New ApplicationException("Cannot create " & name) createdNew = (System.Runtime.InteropServices.Marshal.GetLastWin32Error() = Win32Api.ERROR_ALREADY_EXISTS) Me.Handle = h End Sub Public Overloads Overrides Function WaitOne() As Boolean Return WaitOne(-1, False) End Function Public Overloads Function WaitOne(ByVal millisecondsTimeout As Int32, ByVal notApplicableOnCE As Boolean) As Boolean Return (Win32Api.WaitForSingleObject(Me.Handle, millisecondsTimeout) <> Win32Api.WAIT_TIMEOUT) End Function Public Overloads Function WaitOne(ByVal aTs As TimeSpan, ByVal notApplicableOnCE As Boolean) As Boolean Return (Win32Api.WaitForSingleObject(Me.Handle, aTs.Milliseconds) <> Win32Api.WAIT_TIMEOUT) End Function Public Overrides Sub Close() GC.SuppressFinalize(Me) Win32Api.CloseHandle(Me.Handle) Me.Handle = New IntPtr(-1) End Sub Private Sub New(ByVal aHandle As IntPtr) MyBase.New() If aHandle.Equals(IntPtr.Zero) Then Throw New ApplicationException("CreateEvent failed") Me.Handle = aHandle End Sub Protected Overrides Sub Finalize() Win32Api.CloseHandle(Me.Handle) End Sub #Region "PInvokes" Private Class Win32Api Public Const WAIT_TIMEOUT As Int32 = &H102 '258 Public Const EVENT_ALL_ACCESS As Int32 = &H3 Public Const ERROR_ALREADY_EXISTS As Int32 = 183 Public Enum EventFlags EVENT_RESET = 2 EVENT_SET = 3 End Enum _ Public Shared Function EventModify(ByVal hEvent As IntPtr, ByVal ef As EventFlags) As Boolean End Function _ Public Shared Function WaitForSingleObject(ByVal hHandle As IntPtr, ByVal dwMilliseconds As Int32) As Int32 End Function _ Public Shared Function CreateEvent(ByVal lpEventAttributes As IntPtr, ByVal bManualReset As Boolean, ByVal bInitialState As Boolean, ByVal lpName As String) As IntPtr End Function _ Public Shared Function OpenEvent(ByVal dwDesiredAccess As Int32, ByVal bInheritHandle As Boolean, ByVal lpName As String) As IntPtr End Function _ Public Shared Function CloseHandle(ByVal hObject As IntPtr) As Boolean End Function End Class #End Region End Class Public Enum EventResetMode AutoReset = 0 ManualReset = 1 End Enum End Namespace