/// <summary> /// Called by <see cref="NetMQPoller"/> when there is an incoming message /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnRequestReceived(object sender, NetMQSocketEventArgs e) { NetMQMessage requestMessage = null; if (!socket.TryReceiveMultipartMessage(ref requestMessage, 5)) { return; } // Move handling request off NetMQPoller thread and onto TaskPool as soon as possible Task.Run(() => { if (!messageFactory.IsValidRequestMessage(requestMessage)) { return; } var(request, address, requestId, serializerName) = messageFactory.ExtractRequest(requestMessage); void SendResponse(object response) { var message = messageFactory.CreateResponseMessage(response, address, requestId, serializerName); socket.SendMultipartMessage(message); } var requestTask = new RequestTask(this, request, SendResponse, SendResponse); requestDispatcher.Handle(ref requestTask); }); }
/// <inheritdoc /> public async Task Raise(CancellationToken cancellationToken = default) { foreach (var @event in _events) { await _dispatcher.Handle(@event, cancellationToken); } _events.Clear(); }