public async Task StartAsync()
 {
     HasStarted = true;
     while (OnStartingCallbacks.Count > 0)
     {
         (Func <object, Task> callback, object state) = OnStartingCallbacks.Dequeue();
         if (callback != null)
         {
             await callback.Invoke(state).ConfigureAwait(false);
         }
     }
 }
 public void OnStarting(Func <object, Task> callback, object state)
 {
     OnStartingCallbacks.Enqueue(new Tuple <Func <object, Task>, object>(callback, state));
 }