/// <exception cref="ArgumentOutOfRangeException">The completionStatuses item must have a valid OperationType.</exception> private void Loop() { CompletionStatus[] completionStatuses = new CompletionStatus[Proactor.CompletionStatusArraySize]; while (!this.m_stopping) { // Execute any due timers. int timeout = this.ExecuteTimers(); int removed; if (!this.m_completionPort.GetMultipleQueuedCompletionStatus(timeout != 0 ? timeout : -1, completionStatuses, out removed)) { continue; } for (int i = 0; i < removed; i++) { try { if (completionStatuses[i].OperationType == OperationType.Signal) { IOThreadMailbox mailbox = (IOThreadMailbox)completionStatuses[i].State; mailbox.RaiseEvent(); } // if the state is null we just ignore the completion status else if (completionStatuses[i].State != null) { Item item = (Item)completionStatuses[i].State; if (!item.Cancelled) { switch (completionStatuses[i].OperationType) { case OperationType.Accept: case OperationType.Receive: item.ProactorEvents.InCompleted( completionStatuses[i].SocketError, completionStatuses[i].BytesTransferred); break; case OperationType.Connect: case OperationType.Disconnect: case OperationType.Send: item.ProactorEvents.OutCompleted( completionStatuses[i].SocketError, completionStatuses[i].BytesTransferred); break; default: throw new ArgumentOutOfRangeException(); } } } } catch (TerminatingException) { } } } }
public void SignalMailbox(IOThreadMailbox mailbox) { m_completionPort.Signal(mailbox); }