public override bool GetMultipleQueuedCompletionStatus(int timeout, CompletionStatus[] completionStatuses, out int removed) { // Windows XP Has NO GetQueuedCompletionStatusEx // so we need dequeue IOPC one by one if (Environment.OSVersion.Version.Major == 5) { removed = 0; CompletionStatus completeStatus; bool result = GetQueuedCompletionStatus(timeout, out completeStatus); if (result) { completionStatuses[0] = completeStatus; removed = 1; } return(result); } else { if (m_overlappedEntries == null || m_overlappedEntries.Length < completionStatuses.Length) { if (m_overlappedEntries != null) { m_overlappedEntriesHandle.Free(); } m_overlappedEntries = new OverlappedEntry[completionStatuses.Length]; m_overlappedEntriesHandle = GCHandle.Alloc(m_overlappedEntries, GCHandleType.Pinned); m_overlappedEntriesAddress = Marshal.UnsafeAddrOfPinnedArrayElement(m_overlappedEntries, 0); } bool result = UnsafeMethods.GetQueuedCompletionStatusEx(m_completionPortHandle, m_overlappedEntriesAddress, completionStatuses.Length, out removed, timeout, false); if (!result) { int error = Marshal.GetLastWin32Error(); if (error == WaitTimeoutError) { removed = 0; return(false); } throw new Win32Exception(error); } for (int i = 0; i < removed; i++) { HandleCompletionStatus(out completionStatuses[i], m_overlappedEntries[i].Overlapped, m_overlappedEntries[i].CompletionKey, m_overlappedEntries[i].BytesTransferred); } } return(true); }
public override bool GetMultipleQueuedCompletionStatus(int timeout, CompletionStatus[] completionStatuses, out int removed) { if (m_overlappedEntries == null || m_overlappedEntries.Length < completionStatuses.Length) { if (m_overlappedEntries != null) { m_overlappedEntriesHandle.Free(); } m_overlappedEntries = new OverlappedEntry[completionStatuses.Length]; m_overlappedEntriesHandle = GCHandle.Alloc(m_overlappedEntries, GCHandleType.Pinned); m_overlappedEntriesAddress = Marshal.UnsafeAddrOfPinnedArrayElement(m_overlappedEntries, 0); } bool result = UnsafeMethods.GetQueuedCompletionStatusEx(m_completionPortHandle, m_overlappedEntriesAddress, completionStatuses.Length, out removed, timeout, false); if (!result) { int error = Marshal.GetLastWin32Error(); if (error == WaitTimeoutError) { removed = 0; return(false); } throw new Win32Exception(error); } for (int i = 0; i < removed; i++) { HandleCompletionStatus(out completionStatuses[i], m_overlappedEntries[i].Overlapped, m_overlappedEntries[i].CompletionKey, m_overlappedEntries[i].BytesTransferred); } return(true); }