private async Task ReceiveLoop(PipeReader reader) { try { while (true) { var result = await reader.ReadAsync(); var buffer = result.Buffer; try { if (result.IsCanceled) { break; } while (EventPipeProtocol.TryParseMessage(ref buffer, out var message)) { switch (message) { case EventSourceCreatedMessage eventSourceCreatedMessage: _ = Task.Run(() => OnEventSourceCreated?.Invoke(eventSourceCreatedMessage)); break; case EventWrittenMessage eventWrittenMessage: _ = Task.Run(() => OnEventWritten?.Invoke(eventWrittenMessage)); break; default: throw new NotSupportedException($"Unsupported message type: {message.GetType().FullName}"); } } if (result.IsCompleted) { break; } } finally { reader.AdvanceTo(buffer.Start); } } } catch (Exception ex) { reader.Complete(ex); } finally { reader.Complete(); } }
private async Task ReceiveLoop(PipeReader reader) { Exception shutdownEx = null; try { while (true) { var result = await reader.ReadAsync(); var buffer = result.Buffer; try { if (result.IsCanceled) { return; } while (EventPipeProtocol.TryParseMessage(ref buffer, out var message)) { switch (message) { case EventSourceCreatedMessage eventSourceCreatedMessage: _ = Task.Run(() => OnEventSourceCreated?.Invoke(eventSourceCreatedMessage)); break; case EventWrittenMessage eventWrittenMessage: if (eventWrittenMessage.ProviderName.Equals("Microsoft-Extensions-Logging") && eventWrittenMessage.EventId == 2) { HandleLoggerMessage(eventWrittenMessage); } else if (eventWrittenMessage.EventId == -1 && eventWrittenMessage.EventName.Equals("EventCounters")) { HandleEventCounter(eventWrittenMessage); } else { if (eventWrittenMessage.Message != null && eventWrittenMessage.Payload.Count > 0) { // TODO: This is sketchy. eventWrittenMessage.Message = string.Format(eventWrittenMessage.Message, eventWrittenMessage.Payload.ToArray()); } _ = Task.Run(() => OnEventWritten?.Invoke(eventWrittenMessage)); } break; default: throw new NotSupportedException($"Unsupported message type: {message.GetType().FullName}"); } } if (result.IsCompleted) { return; } } finally { reader.AdvanceTo(buffer.Start); } } } catch (Exception ex) { reader.Complete(ex); shutdownEx = ex; } finally { _ = Task.Run(() => Disconnected?.Invoke(shutdownEx)); reader.Complete(); } }