private void PrepareAsyncState() { _outputReady = new AsyncCallback(OutputCallback); _outputState = new AsyncState(_standardOutput, _outputBuffer); _errorReady = new AsyncCallback(ErrorCallback); _errorState = new AsyncState(_standardError, _errorBuffer); }
private void PrepareAsyncState(bool errorStream = false) { _outputReady = OutputCallback; _outputState = new AsyncState(_standardOutput, _outputBuffer); if (!errorStream) { return; } _errorReady = ErrorCallback; _errorState = new AsyncState(_standardError, _errorBuffer); }
/// <summary> /// Callback for the error stream /// </summary> /// <param name="ar"></param> private void ErrorCallback(IAsyncResult ar) { AsyncState state = (AsyncState)ar.AsyncState; int count = state.Stream.BaseStream.EndRead(ar); if (count > 0) { Debug.WriteLine(Encoding.Default.GetString(state.Buffer)); Debugger.Break(); _standardError.BaseStream.BeginRead( _errorBuffer, 0, _errorBuffer.Length, _errorReady, _errorState ); } }
/// <summary> /// Gets executed if BeginRead() has red some data /// </summary> /// <param name="ar">Async Result</param> private void OutputCallback(IAsyncResult ar) { AsyncState state = (AsyncState)ar.AsyncState; int count = state.Stream.BaseStream.EndRead(ar); if (count > 0) { int readCount = 0; while (count > readCount) { var data = Unpacking.UnpackObject(state.Buffer, readCount); readCount += data.ReadCount; if (!data.Value.IsArray) { Debugger.Break(); } var dataList = data.Value.AsList().Select(x => new MessagePackObject(x)).ToList(); // Response message has 4 items in the array if (dataList.Count == 4) { var type = (MessageType)dataList[0].AsInteger(); if (type != MessageType.Response) { Debugger.Break(); } var msgId = dataList[1].AsInteger(); var err = dataList[2]; var res = dataList[3]; _tcs[msgId].SetResult(new[] { err, res }); } // Notification message has 3 items in the array else if (dataList.Count == 3) { var type = (MessageType)dataList[0].AsInteger(); if (type != MessageType.Notification) { Debugger.Break(); } var func = dataList[1].AsString(Encoding.Default); var res = dataList[2]; MsgPackNotificationEventArgs args = new MsgPackNotificationEventArgs { Method = func, Params = res }; OnNotificationReceived(args); } else { Debugger.Break(); } } Array.Clear(state.Buffer, 0, state.Buffer.Length); _standardOutput.BaseStream.BeginRead( _outputBuffer, 0, _outputBuffer.Length, _outputReady, _outputState ); } }