12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- using System.Threading;
- #if (_WINDOWS_CE)
- using System;
- using System.Runtime.InteropServices;
- #endif
- namespace Amib.Threading.Internal
- {
- /// <summary>
- /// EventWaitHandleFactory class.
- /// This is a static class that creates AutoResetEvent and ManualResetEvent objects.
- /// In WindowCE the WaitForMultipleObjects API fails to use the Handle property
- /// of XxxResetEvent. It can use only handles that were created by the CreateEvent API.
- /// Consequently this class creates the needed XxxResetEvent and replaces the handle if
- /// it's a WindowsCE OS.
- /// </summary>
- public static class EventWaitHandleFactory
- {
- /// <summary>
- /// Create a new AutoResetEvent object
- /// </summary>
- /// <returns>Return a new AutoResetEvent object</returns>
- public static AutoResetEvent CreateAutoResetEvent()
- {
- AutoResetEvent waitHandle = new AutoResetEvent(false);
- #if (_WINDOWS_CE)
- ReplaceEventHandle(waitHandle, false, false);
- #endif
- return waitHandle;
- }
- /// <summary>
- /// Create a new ManualResetEvent object
- /// </summary>
- /// <returns>Return a new ManualResetEvent object</returns>
- public static ManualResetEvent CreateManualResetEvent(bool initialState)
- {
- ManualResetEvent waitHandle = new ManualResetEvent(initialState);
- #if (_WINDOWS_CE)
- ReplaceEventHandle(waitHandle, true, initialState);
- #endif
- return waitHandle;
- }
- #if (_WINDOWS_CE)
- /// <summary>
- /// Replace the event handle
- /// </summary>
- /// <param name="waitHandle">The WaitHandle object which its handle needs to be replaced.</param>
- /// <param name="manualReset">Indicates if the event is a ManualResetEvent (true) or an AutoResetEvent (false)</param>
- /// <param name="initialState">The initial state of the event</param>
- private static void ReplaceEventHandle(WaitHandle waitHandle, bool manualReset, bool initialState)
- {
- // Store the old handle
- IntPtr oldHandle = waitHandle.Handle;
- // Create a new event
- IntPtr newHandle = CreateEvent(IntPtr.Zero, manualReset, initialState, null);
- // Replace the old event with the new event
- waitHandle.Handle = newHandle;
- // Close the old event
- CloseHandle (oldHandle);
- }
- [DllImport("coredll.dll", SetLastError = true)]
- public static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);
- //Handle
- [DllImport("coredll.dll", SetLastError = true)]
- public static extern bool CloseHandle(IntPtr hObject);
- #endif
- }
- }
|