Example #1
0
        public async Task StartAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation($"{GetType().Name} is running !");
            var activeTasks = new ConcurrentDictionary <string, Task>();

            while (!stoppingToken.IsCancellationRequested)
            {
                await _workflowController.TryResumeWorkflowInstanceAsync(stoppingToken);

                if (_workflowController.TryGetWorkflowInstance(out var wfi))
                {
                    var task = new Task(async(dynamic state) =>
                    {
                        try
                        {
                            await ExecuteAsync(state.wfi, state.stoppingToken);
                        }
                        finally
                        {
                            await _workflowController.CompleteWorkflowAsync(wfi);
                            activeTasks.TryRemove(wfi.Id, out var t);
                        }
                    },
                                        new
                    {
                        wfi,
                        stoppingToken
                    },
                                        TaskCreationOptions.LongRunning);
                    activeTasks.TryAdd(wfi.Id, task);
                    task.Start();
                }
                else
                {
                    await Task.Delay(2000, stoppingToken);
                }
            }
            await Task.WhenAll(activeTasks.Values);

            _logger.LogInformation($"{nameof(GetType)} is stop !");
        }