protected override void DispatchConnection(UvStreamHandle socket) { var index = _dispatchIndex++ % (_dispatchPipes.Count + 1); if (index == _dispatchPipes.Count) { base.DispatchConnection(socket); } else { DetachFromIOCP(socket); var dispatchPipe = _dispatchPipes[index]; var write = new UvWriteReq(Log); try { write.Init(Thread); write.Write2( dispatchPipe, _dummyMessage, socket, (write2, status, error, state) => { write2.Dispose(); ((UvStreamHandle)state).Dispose(); }, socket); } catch (UvException) { write.Dispose(); throw; } } }
private async Task ConnectedCallback(UvConnectRequest connect, int status, UvException error, TaskCompletionSource <int> tcs) { connect.Dispose(); if (error != null) { tcs.SetException(error); return; } var writeReq = new UvWriteReq(Log); try { DispatchPipe.ReadStart( (handle, status2, state) => ((UvListenerSecondary)state)._buf, (handle, status2, state) => ((UvListenerSecondary)state).ReadStartCallback(handle, status2), this); writeReq.Init(_thread); var result = await writeReq.WriteAsync( DispatchPipe, new ArraySegment <ArraySegment <byte> >(new[] { new ArraySegment <byte>(_pipeMessage) })); if (result.Error != null) { tcs.SetException(result.Error); } else { tcs.SetResult(0); } } catch (Exception ex) { DispatchPipe.Dispose(); tcs.SetException(ex); } finally { writeReq.Dispose(); } }
public UvWriteReq Allocate() { if (_disposed) { throw new ObjectDisposedException(GetType().Name); } UvWriteReq req; if (_pool.Count > 0) { req = _pool.Dequeue(); } else { req = new UvWriteReq(_log); req.Init(_thread); } return(req); }