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