Пример #1
0
        private async Task RunBackloggedQueuesAsync()
        {
            var backloggedQueueNames = await asyncEventQueueManager.GetNonemptyQueueNamesAsync();

            var throttledTasks = new List <Task>();

            using (var throttle = new SemaphoreSlim(asyncEventPipelineConfiguration.CatchUpProcessingParallelism))
            {
                foreach (string queueName in backloggedQueueNames)
                {
                    await throttle.WaitAsync();

                    throttledTasks.Add(Task.Factory.StartNewWithContext(async() =>
                    {
                        try
                        {
                            var asyncEventQueueBacklogWorker = asyncEventWorkerFunc();
                            await asyncEventQueueBacklogWorker.RunQueueBacklogAsync(queueName);
                        }
                        catch (AsyncEventProcessingException e)
                        {
                            // TODO reschedule?
                            Logger.Error(e,
                                         $"AsyncEventProcessingException occurred while processing async event queue {queueName} during startup");
                        }
                        finally
                        {
                            throttle.Release();
                        }
                    }));
                }

                await Task.WhenAll(throttledTasks);
            }
        }