/// <summary> /// publish a constant stream of events. /// </summary> /// <param name="notification">KubeMQ:Event Class.</param> /// <param name="resultDelegate"></param> /// <returns>A task that represents the event request that was sent using the StreamEvent .</returns> public async Task StreamEvent(Event notification, ReceiveResultDelegate resultDelegate) { if (!notification.ReturnResult) { await StreamEventWithoutResponse(notification); return; } // implement bi-di streams 'SendEventStream (stream Event) returns (stream Result)' try { InnerEvent innerEvent = notification.ToInnerEvent(); // Send Event via GRPC RequestStream await GetKubeMQClient().SendEventsStream(_metadata).RequestStream.WriteAsync(innerEvent); // Listen for Async Response (Result) using (var call = GetKubeMQClient().SendEventsStream(_metadata)) { // Wait for Response.. await call.ResponseStream.MoveNext(CancellationToken.None); // Received a Response KubeMQGrpc.Result response = call.ResponseStream.Current; // add response to queue _RecivedResults.Post(response); LogResponse(response); } // send result (response) to end-user var resultTask = Task.Run((Func <Task>)(async() => { while (true) { // await for response from queue KubeMQGrpc.Result response = await _RecivedResults.ReceiveAsync(); // Convert KubeMQ.Grpc.Result to outer Result Result result = new Result(response); // Activate end-user Receive-Result-Delegate resultDelegate(result); } })); } catch (RpcException ex) { logger.LogError(ex, "RPC Exception in StreamEvent"); throw new RpcException(ex.Status); } catch (Exception ex) { logger.LogError(ex, "Exception in StreamEvent"); throw new Exception(ex.Message); } }
/// <summary> /// bi-di streams 'SendEventStream (stream Event) returns (stream Result) ,closed by ClosesEventStreamAsync() /// </summary> /// <param name="notification">KubeMQ.SDK.csharp.Events.Event which represent the data to send using the KubeMQ.</param> /// <param name="resultDelegate">Result stream handler delegate, use null when using Unidirectional no Result</param> /// <returns></returns> public async Task StreamEvent(Event notification, ReceiveResultDelegate resultDelegate = null) { await _sender.StreamEvent(CreateLowLevelEvent(notification, (resultDelegate != null)), resultDelegate); }