public void Return(EventArgsPair eventArgs)
 {
     lock (syncRoot)
     {
         eventArgs.Send.SetBuffer(eventArgs.BufferOffset, bufferSize * 2);
         eventArgs.Receive.SetBuffer(eventArgs.BufferOffset, bufferSize * 2);
         pool.Push(eventArgs);
     }
 }
            public Channel(Direction direction, Socket source, Socket target, ProxyClient client)
            {
                this.direction = direction;
                this.source    = source;
                this.target    = target;
                this.client    = client;

                eventArgs = client.eventArgsManager.Take();
                eventArgs.Send.Completed    += SendEventArgs_Completed;
                eventArgs.Receive.Completed += ReceiveEventArgs_Completed;
            }
            public void Dispose()
            {
                if (!disposed)
                {
                    var eventArgs = this.eventArgs;
                    this.eventArgs = null;

                    if (eventArgs != null)
                    {
                        eventArgs.Send.Completed    -= SendEventArgs_Completed;
                        eventArgs.Receive.Completed -= ReceiveEventArgs_Completed;
                        client.eventArgsManager.Return(eventArgs);
                    }

                    disposed = true;
                }
            }