public override Task WriteAsync(IChannelHandlerContext ctx, object msg) { Task result; ThreadLocalObjectList output = null; try { if (base.AcceptOutboundMessage(msg)) { output = ThreadLocalObjectList.NewInstance(); var cast = (PacketInfo)msg; try { base.Encode(ctx, cast, output); } finally { ReferenceCountUtil.Release(cast); } if (output.Count == 0) { output.Return(); output = null; throw new EncoderException(this.GetType().Name + " must produce at least one message."); } } else { return(ctx.WriteAsync(msg)); } } catch (EncoderException e) { throw new EncoderException(e); } catch (Exception ex) { throw new EncoderException(ex); } finally { if (output != null) { if (output.Count > 0) { IByteBuffer byteBuffer = Unpooled.CopiedBuffer(output.ConvertAll(v => v as IByteBuffer).ToArray()); result = ctx.WriteAsync(new BinaryWebSocketFrame(byteBuffer)); } else { // 0 items in output - must never get here result = null; } output.Return(); } else { // output was reset during exception handling - must never get here result = null; } } return(result); }