public async Task ConcurrentOnNext(Immutable <byte[]> bytes) { var(success, transport) = EventBytesTransport.FromBytesWithNoId(bytes.Value); if (success) { var data = Serializer.Deserialize(TypeContainer.GetType(transport.EventTypeCode), transport.EventBytes); if (data is IEvent @event) { var eventBase = EventBase.FromBytes(transport.BaseBytes); if (eventBase.Version > Snapshot.Version) { var input = new AsyncInputEvent <IFullyEvent <PrimaryKey>, bool>(new FullyEvent <PrimaryKey> { StateId = GrainId, Base = eventBase, Event = @event }); var writeTask = ConcurrentChannel.WriteAsync(input); if (!writeTask.IsCompletedSuccessfully) { await writeTask; } if (!writeTask.Result) { var ex = new ChannelUnavailabilityException(GrainId.ToString(), GrainType); Logger.LogError(ex, ex.Message); throw ex; } await input.TaskSource.Task; } } else { if (Logger.IsEnabled(LogLevel.Information)) { Logger.LogInformation("Receive non-event messages, grain Id = {0} ,message type = {1}", GrainId.ToString(), transport.EventTypeCode); } } } }
protected async Task <bool> ConcurrentTxRaiseEvent( long transactionId, Func <Snapshot <PrimaryKey, SnapshotType>, Func <IEvent, EventUID, Task>, Task> handler) { var taskSource = new TaskCompletionSource <bool>(); if (transactionId <= 0) { throw new TxIdException(); } var writeTask = ConcurrentChannel.WriteAsync(new ConcurrentTransport <Snapshot <PrimaryKey, SnapshotType> >(transactionId, handler, taskSource)); if (!writeTask.IsCompletedSuccessfully) { await writeTask; } if (!writeTask.Result) { var ex = new ChannelUnavailabilityException(GrainId.ToString(), GrainType); Logger.LogError(ex, ex.Message); throw ex; } return(await taskSource.Task); }