private unsafe void Execute() { while (completed == false) { uint bytesRead; uint completionKey; NativeOverlapped *native; bool result = CompletionInterop.GetQueuedCompletionStatus( port, out bytesRead, out completionKey, &native, 1000); if (native != null) { Overlapped overlapped = Overlapped.Unpack(native); CompletionCallback callback = overlapped.AsyncResult as CompletionCallback; if (result) { callback?.Complete((int)bytesRead); } else { callback?.Fail(native); } Overlapped.Free(native); } } }
private unsafe void Execute() { CompletionInterop.OverlappedEntry[] entries = new CompletionInterop.OverlappedEntry[1024]; while (completed == false) { uint processed; bool result = CompletionInterop.GetQueuedCompletionStatusEx( port, entries, entries.Length, out processed, 1000, 0); if (result) { for (int i = 0; i < processed; i++) { CompletionInterop.OverlappedEntry entry = entries[i]; Overlapped overlapped = Overlapped.Unpack(entry.lpOverlapped); CompletionCallback callback = overlapped.AsyncResult as CompletionCallback; callback?.Complete(entry.lpOverlapped, (int)entry.dwNumberOfBytesTransferred); Overlapped.Free(entry.lpOverlapped); } } } }