protected void HandlePipeConnection(PipeStream pipeStream, IDictionary<string, object> initialMessage) { // You think we'd scope these with using() right? They are IDisposable // after all... but nope, the implementation of these is such that // disposing of them also disposes the underlying stream. Leaving us // with a double (or triple if we close the pipeServer stream ourselves) // close. Yay. Instead we abandoned these to the GC knowing that they // are only wrappers anyway and have/use little/no resources of their own. BinaryReader reader = new BinaryReader(pipeStream, Encoding.Unicode); BinaryWriter writer = new BinaryWriter(pipeStream, Encoding.Unicode); try { // If we should announce with a specific message, do so if (initialMessage != null) { WriteMessage(writer, initialMessage); } // So long as our Func<> returns true, we keep going. When it returns false, // it is done and its time to closeup and look for another client. while (StreamAction(reader, writer)) { } } catch(Exception e) { LibraryLogging.Error("Error while using pipe connection: {0}", e); } try { pipeStream.Flush(); pipeStream.WaitForPipeDrain(); pipeStream.Close(); } catch(Exception e) { LibraryLogging.Error("Error while flushing/closing pipe connection: {0}", e); } }
public void OnAsyncMessage(PipeStream pipe, Byte [] data, Int32 bytes, Object state) { Console.WriteLine("Message: " + (Int32) state + " bytes: " + bytes); data = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(data, 0, bytes).ToUpper().ToCharArray()); // Write results try { pipe.BeginWrite(data, 0, bytes, OnAsyncWriteComplete, pipe); } catch (Exception) { pipe.Close(); } }