Пример #1
0
            private async Task ProcessDumpQueue(CancellationToken cancellationToken)
            {
                while (true)
                {
                    // ReSharper disable once MethodSupportsCancellation
                    var hasItem = await _dumpLock.WaitAsync(WindowMillisecondsTimeout).ConfigureAwait(false);

                    if (!hasItem)
                    {
                        if (cancellationToken.IsCancellationRequested)
                        {
                            return;
                        }
                        continue;
                    }

                    var          list      = new List <ResultObject>();
                    var          timestamp = Environment.TickCount;
                    ResultObject item;
                    while (Environment.TickCount - timestamp < WindowMillisecondsTimeout &&
                           list.Count < WindowMaxCount &&
                           _dumpQueue.TryDequeue(out item))
                    {
                        if (list.Count > 0)
                        {
                            // ReSharper disable once MethodSupportsCancellation
                            await _dumpLock.WaitAsync().ConfigureAwait(false);
                        }
                        list.Add(item);
                    }

                    if (list.Count > 0)
                    {
                        try
                        {
                            var task = _callbackChannel?.Dump(list);
                            if (task != null)
                            {
                                await task.ConfigureAwait(false);
                            }
                        }
                        catch
                        {
                            // ignored
                        }
                    }
                }
                // ReSharper disable once FunctionNeverReturns
            }