コード例 #1
0
        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);
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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));
        }