public override void Flush()
        {
            var message = $"{Name}.Flush()";

            if (RequireAsync && !AllowSyncFlush)
            {
                throw Context.AssertFail($"{message}: async API required.");
            }

            SyncFlushFunc syncFlush         = () => base.Flush();
            SyncFlushFunc originalSyncFlush = syncFlush;

            var action = Interlocked.Exchange(ref flushAction, null);

            if (action?.AsyncFlush != null)
            {
                message += " - action";

                AsyncFlushFunc asyncBaseFlush = (_) => Task.Factory.FromAsync(
                    (callback, state) => originalSyncFlush.BeginInvoke(callback, state),
                    (result) => originalSyncFlush.EndInvoke(result), null);

                syncFlush = () => action.AsyncFlush(asyncBaseFlush, CancellationToken.None).Wait();
            }

            Flush_internal(message, syncFlush);
        }
 void Flush_internal(string message, SyncFlushFunc func)
 {
     LogDebug(message);
     try {
         func();
         LogDebug($"{message} done");
     } catch (Exception ex) {
         if (IgnoreErrors)
         {
             return;
         }
         LogDebug($"{message} failed: {ex}");
         throw;
     }
 }