public PostedMessage <T> Fanout() { var fanout = new PostedMessage <T> { Argument = this.Argument }; _fanoutTasks.Add(fanout._completion.Task); return(fanout); }
public void Post(PostedMessage <T> message) { Context.StartNew(() => { try { Handler.Invoke(null, message.Argument); message.Complete(); } catch (Exception ex) { message.MarkError(ex); } }); }
private static async Task PostToEventSource <T>(T obj, EventRegistrationTokenTable <EventHandler <PostedMessage <T> > > eventSource) { PostedMessage <T> message = new PostedMessage <T> { Argument = obj }; await Task.Run(() => { // If we have delegates bound to the event source, each one // will get a fanned out PostedMessage. They will all get aggregated // and returned via GetAggregatedTask() below. eventSource.InvocationList?.Invoke(null, message); // And mark the "parent" PostedMessage as being completed. This // also handles the case of not having any delegates bound to the // invocation list. message.Complete(); }); await message.GetAggregatedTask(); }