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); }
async Task FlushAsync(string message, AsyncFlushFunc func, AsyncFlushHandler handler, CancellationToken cancellationToken) { LogDebug(message); try { await handler(func, cancellationToken).ConfigureAwait(false); LogDebug($"{message} done"); } catch (Exception ex) { if (IgnoreErrors) { return; } LogDebug($"{message} failed: {ex}"); throw; } }
public override Task FlushAsync(CancellationToken cancellationToken) { var message = $"{Name}.FlushAsync()"; AsyncFlushFunc asyncBaseFlush = base.FlushAsync; AsyncFlushHandler asyncFlushHandler = (func, ct) => func(ct); var action = Interlocked.Exchange(ref flushAction, null); if (action?.AsyncFlush != null) { message += " - action"; return(FlushAsync(message, asyncBaseFlush, action.AsyncFlush, cancellationToken)); } return(FlushAsync(message, asyncBaseFlush, asyncFlushHandler, cancellationToken)); }