using System; namespace DotnetStreams { public class BytesReadEventArgs { public byte[] Data { get; } public int Size { get; } public BytesReadEventArgs(byte[] data, int size) { this.Data = data; this.Size = size; } } public delegate void BytesReadEventHandler(object sender, BytesReadEventArgs e); public class BinaryStdinReader { protected readonly Action dataReceiverProc; protected readonly Action doneProc; public event BytesReadEventHandler OnBytesRead; public event EventHandler OnDone; public BinaryStdinReader(Action dataReceiverProc, Action doneProc) { this.dataReceiverProc = dataReceiverProc; this.doneProc = doneProc; } public BinaryStdinReader() { } public void ReadBytes(Action receiverProc, Action doneProc) { using System.IO.Stream stdinStream = System.Console.OpenStandardInput(); int totalBytesRead = 0; int bufferSize = 2048; byte[] buffer = new byte[bufferSize]; int bytesRead = stdinStream.Read(buffer, 0, bufferSize); while (bytesRead > 0) { OnBytesRead?.Invoke(this, new BytesReadEventArgs(buffer, bytesRead)); receiverProc?.Invoke(buffer, bytesRead); if (bytesRead < bufferSize) break; bytesRead = stdinStream.Read(buffer, 0, bufferSize); totalBytesRead += bytesRead; } OnDone?.Invoke(this, new EventArgs()); doneProc?.Invoke(totalBytesRead); } } }