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; } }