The exact equivalent to your CreateEvent() call is a ManualResetEvent
in C# code. Pass its Handle property to your native code.
The exact equivalent to your WaitForSingleObject() call is ManualResetEvent.WaitOne(int) in C#. It returns false if the timeout expired.