using System; using System.IO; using System.IO.Pipes; using System.Text; using System.Threading; public class AsyncState { public byte[] Buffer { get; set; } public PipeStream Stream { get; set; } public MemoryStream MemoryStream { get; set; } public ManualResetEvent EvtHandle { get; set; } } /// /// 服务端管道 /// class NamedPipeServer { private NamedPipeServerStream Server { get; set; } private byte[] Buffer; private int BufferSize = 10; private StringBuilder InputStr { get; set; } public NamedPipeServer(string name) { this.Server = new NamedPipeServerStream(name, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.None); this.InputStr = new StringBuilder(); Buffer = new byte[BufferSize]; } public void Start() { while (true) { this.Server.WaitForConnection(); AsyncState asyncState = new AsyncState() { Buffer = new byte[BufferSize], EvtHandle = new ManualResetEvent(false), Stream = this.Server }; //异步读取,并阻塞线程,读取结束取消阻塞 this.Server.BeginRead(this.Buffer, 0, this.Buffer.Length, new AsyncCallback(ReadCallback), asyncState); asyncState.EvtHandle.WaitOne(); //获取输出字符串 string outStr = ""; if (Readed != null) outStr = this.Readed.Invoke(this.InputStr.ToString().Replace("\0", " ").Trim()).Trim(); this.InputStr.Clear(); for (int i = 0; i < this.BufferSize; i++) outStr = " " + outStr; //输出到内存流,然后内存流转写字节码到服务流中 using (MemoryStream memoryStream = new MemoryStream()) using (StreamWriter write = new StreamWriter(memoryStream)) { write.Write(outStr); write.Flush(); memoryStream.Flush(); int length = 0; memoryStream.Position = 0; byte[] tmp = new byte[BufferSize]; while (((length = memoryStream.Read(tmp, 0, this.Buffer.Length)) != 0)) { Server.Write(tmp, 0, length); } } Server.WaitForPipeDrain(); Server.Flush(); Server.Disconnect(); } } private void ReadCallback(IAsyncResult arg) { AsyncState state = arg.AsyncState as AsyncState; int length = state.Stream.EndRead(arg); if (length > 0) { byte[] buffer; if (length == BufferSize) buffer = state.Buffer; else { buffer = new byte[length]; Array.Copy(state.Buffer, 0, buffer, 0, length); } if (state.MemoryStream == null) state.MemoryStream = new MemoryStream(); state.MemoryStream.Write(buffer, 0, buffer.Length); state.MemoryStream.Flush(); } if (length < BufferSize) { state.MemoryStream.Position = 0; using (StreamReader reader = new StreamReader(state.MemoryStream)) { this.InputStr.Append(reader.ReadToEnd()); } state.MemoryStream.Close(); state.MemoryStream.Dispose(); state.MemoryStream = null; state.EvtHandle.Set(); } else { Array.Clear(state.Buffer, 0, BufferSize); //再次执行异步读取操作 state.Stream.BeginRead(state.Buffer, 0, BufferSize, new AsyncCallback(ReadCallback), state); } } public event Func Readed; }