private void ParseAndInsertLogEventIntoQueueAutomatically(LogEventId eventId, LogEventLevel level, Exception exception, string messageTemplate, ILogCallerInfo callerInfo, LogEventContext context = null, params object[] messageTemplateParameters) { var task = CreateEnqueueTask(); task.ContinueWith(t => DispatchForAutomatic()); task.Start(); Task CreateEnqueueTask() { var taskResult = new Task(async() => { var writer = await _automaticAsyncQueue.AcquireWriteAsync(1, CancellationToken.None); writer.Visit( succeeded => { _messageParameterProcessor.Process(messageTemplate, __as(messageTemplateParameters, context), out var parsedTemplate, out var namedMessageProperties, out var positionalMessageProperties); var logEvent = new LogEvent(StateNamespace, eventId, level, parsedTemplate, exception, LogEventSendMode.Automatic, callerInfo, _upstreamRenderingOptions, namedMessageProperties, positionalMessageProperties, context, messageProcessorShortcut: _messageParameterProcessor); if (succeeded.ItemCount >= 1) { _automaticAsyncQueue.ReleaseWrite(logEvent); } else { _automaticAsyncQueue.ReleaseWrite(); } return(logEvent); }, cancelled => { InternalLogger.WriteLine("When insert log event(0) into async queue, task has been cancelled."); return(null); }, faulted => { InternalLogger.WriteLine( $@"Thrown an exception when insert log event(0) into async queue:{Environment.NewLine}{faulted.Exception.ToUnwrappedString()}", faulted.Exception); return(null); }); }); return(taskResult); object[] __as(object[] __paramObjs, LogEventContext __context) { if (__paramObjs == null || !__paramObjs.Any()) { return(__context?.Parameters.ToArray()); } return(__paramObjs.GetType() != typeof(object[]) ? new object[] { __paramObjs } : __paramObjs); } } }
private async Task SimpleQueueTestAsync() { AsyncQueue <int> queue = new AsyncQueue <int>(11); Func <Task> producer = async delegate() { #region for (int i = 0; i < 20; ++i) { System.Diagnostics.Debug.WriteLine("Acquiring write..."); AcquireWriteResult result = await queue.AcquireWriteAsync(1, CancellationToken.None); result.Visit <DBNull> ( new Func <AcquireWriteSucceeded, DBNull> ( succeeded => { System.Diagnostics.Debug.WriteLine("Write-acquire succeeded, offset " + succeeded.Offset + ", acquired " + succeeded.ItemCount + " spaces"); Assert.AreEqual(1, succeeded.ItemCount); if (succeeded.ItemCount >= 1) { System.Diagnostics.Debug.WriteLine("Releasing write (1)..."); queue.ReleaseWrite(i); } else { System.Diagnostics.Debug.WriteLine("Releasing write (0)..."); queue.ReleaseWrite(); } return(DBNull.Value); } ), new Func <AcquireWriteCancelled, DBNull> ( cancelled => { throw new OperationCanceledException(); } ), new Func <AcquireWriteFaulted, DBNull> ( faulted => { throw faulted.Exception; } ) ); } System.Diagnostics.Debug.WriteLine("Writing EOF..."); queue.WriteEof(); #endregion }; Func <Task> consumer = async delegate() { #region bool more = true; while (more) { System.Diagnostics.Debug.WriteLine("Acquiring read..."); const int ACQUIRE_COUNT = 3; AcquireReadResult result = await queue.AcquireReadAsync(ACQUIRE_COUNT, CancellationToken.None); result.Visit <DBNull> ( new Func <AcquireReadSucceeded, DBNull> ( succeeded => { System.Diagnostics.Debug.WriteLine("Read-acquire succeeded, offset " + succeeded.Offset + ", acquired " + succeeded.ItemCount + " items"); Assert.IsInstanceOfType(succeeded, typeof(AcquireReadSucceeded <int>)); if (succeeded is AcquireReadSucceeded <int> ) { AcquireReadSucceeded <int> succeeded2 = (AcquireReadSucceeded <int>)succeeded; System.Diagnostics.Debug.WriteLine("{ " + string.Join(", ", succeeded2.Items) + " }"); } if (succeeded.ItemCount < ACQUIRE_COUNT) { System.Diagnostics.Debug.WriteLine("Setting \"more\" flag to false..."); more = false; } System.Diagnostics.Debug.WriteLine("Releasing read (" + succeeded.ItemCount + ")..."); queue.ReleaseRead(succeeded.ItemCount); return(DBNull.Value); } ), new Func <AcquireReadCancelled, DBNull> ( cancelled => { throw new OperationCanceledException(); } ), new Func <AcquireReadFaulted, DBNull> ( faulted => { throw faulted.Exception; } ) ); } #endregion }; Task tProducer = Task.Run(producer); Task tConsumer = Task.Run(consumer); await Task.WhenAll(tProducer, tConsumer); }
private async Task SimpleQueueTestAsync() { AsyncQueue<int> queue = new AsyncQueue<int>(11); Func<Task> producer = async delegate() { #region for (int i = 0; i < 20; ++i) { System.Diagnostics.Debug.WriteLine("Acquiring write..."); AcquireWriteResult result = await queue.AcquireWriteAsync(1, CancellationToken.None); result.Visit<DBNull> ( new Func<AcquireWriteSucceeded, DBNull> ( succeeded => { System.Diagnostics.Debug.WriteLine("Write-acquire succeeded, offset " + succeeded.Offset + ", acquired " + succeeded.ItemCount + " spaces"); Assert.AreEqual(1, succeeded.ItemCount); if (succeeded.ItemCount >= 1) { System.Diagnostics.Debug.WriteLine("Releasing write (1)..."); queue.ReleaseWrite(i); } else { System.Diagnostics.Debug.WriteLine("Releasing write (0)..."); queue.ReleaseWrite(); } return DBNull.Value; } ), new Func<AcquireWriteCancelled, DBNull> ( cancelled => { throw new OperationCanceledException(); } ), new Func<AcquireWriteFaulted, DBNull> ( faulted => { throw faulted.Exception; } ) ); } System.Diagnostics.Debug.WriteLine("Writing EOF..."); queue.WriteEof(); #endregion }; Func<Task> consumer = async delegate() { #region bool more = true; while (more) { System.Diagnostics.Debug.WriteLine("Acquiring read..."); const int ACQUIRE_COUNT = 3; AcquireReadResult result = await queue.AcquireReadAsync(ACQUIRE_COUNT, CancellationToken.None); result.Visit<DBNull> ( new Func<AcquireReadSucceeded, DBNull> ( succeeded => { System.Diagnostics.Debug.WriteLine("Read-acquire succeeded, offset " + succeeded.Offset + ", acquired " + succeeded.ItemCount + " items"); Assert.IsInstanceOfType(succeeded, typeof(AcquireReadSucceeded<int>)); if (succeeded is AcquireReadSucceeded<int>) { AcquireReadSucceeded<int> succeeded2 = (AcquireReadSucceeded<int>)succeeded; System.Diagnostics.Debug.WriteLine("{ " + string.Join(", ", succeeded2.Items) + " }"); } if (succeeded.ItemCount < ACQUIRE_COUNT) { System.Diagnostics.Debug.WriteLine("Setting \"more\" flag to false..."); more = false; } System.Diagnostics.Debug.WriteLine("Releasing read (" + succeeded.ItemCount + ")..."); queue.ReleaseRead(succeeded.ItemCount); return DBNull.Value; } ), new Func<AcquireReadCancelled, DBNull> ( cancelled => { throw new OperationCanceledException(); } ), new Func<AcquireReadFaulted, DBNull> ( faulted => { throw faulted.Exception; } ) ); } #endregion }; Task tProducer = Task.Run(producer); Task tConsumer = Task.Run(consumer); await Task.WhenAll(tProducer, tConsumer); }