异步操作样本1

Sample C code calling it:

OVERLAPPED overlapped;   
overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);   
fns.NotifyStateChange(&overlapped);   
WaitForSingleObject(overlapped.hEvent, INFINITE);   
// ...query for the new state or whatever... 

This is how I approached it in C#:

[DllImport("myfuncs.dll")] 
unsafe public static extern int NotifyStateChange(NativeOverlapped* lpOverlapped); 
 
static private ManualResetEvent m_stateChangeEvent = new ManualResetEvent(false); 
 
public static DeviceState WaitForStateChange() 
{ 
    unsafe 
    { 
        Overlapped overlapped = new Overlapped(0, 0,  
            m_stateChangeEvent.SafeWaitHandle.DangerousGetHandle(), null); 
        IOCompletionCallback callback = StateChangeCallback; 
        byte[] userData = new byte[100]; 
        NativeOverlapped* nativeOverlapped = overlapped.Pack(callback, userData); 
        NotifyStateChange(nativeOverlapped); 
        m_stateChangeEvent.WaitOne(); 
        Overlapped.Unpack(nativeOverlapped); 
        Overlapped.Free(nativeOverlapped); 
    } 
    return GetCurrentState(); 
} 
 
[ComVisibleAttribute(true)] 
unsafe static public void StateChangeCallback ( 
    uint errorCode,  
    uint bytesTransferred,  
    NativeOverlapped* overlapped) 
{ 
    m_stateChangeEvent.Set(); 
} 
原文地址:https://www.cnblogs.com/kevinzhwl/p/3878904.html