private async void AsyncCallback(object State) { try { object[] P = (object[])State; ScheduledEventCallbackAsync Callback = (ScheduledEventCallbackAsync)P[0]; State = P[1]; await(Callback?.Invoke(State) ?? Task.CompletedTask); } catch (Exception ex) { Log.Critical(ex); } }
/// <summary> /// Adds an event. /// </summary> /// <param name="When">When to execute the event.</param> /// <param name="Callback">Method called when event is to be executed.</param> /// <param name="State">State object bassed to <paramref name="Callback"/>.</param> /// <returns>Time when event was scheduled. May differ from <paramref name="When"/> by a few ticks, to make sure the timestamp is unique.</returns> public DateTime Add(DateTime When, ScheduledEventCallbackAsync Callback, object State) { lock (this.events) { while (this.events.ContainsKey(When)) { When = When.AddTicks(this.gen.Next(1, 10)); } this.events[When] = new ScheduledEvent(When, Callback, State); this.RecalcTimerLocked(); } return(When); }
/// <summary> /// Contains information about a scheduled event. /// </summary> /// <param name="When">When an event is to be executed.</param> /// <param name="EventMethod">Method to call when event is executed.</param> /// <param name="State">State object passed on to <paramref name="EventMethod"/>.</param> public ScheduledEvent(DateTime When, ScheduledEventCallbackAsync EventMethod, object State) { this.when = When; this.eventMethod = this.AsyncCallback; this.state = new object[] { EventMethod, State }; }