独立运行任务?

时间:2018-06-26 11:20:48

标签: c# task asp.net-core-2.0

我正在使用Net Core 2.1中的新托管服务通过RabbitMq接收某些消息。

虽然我可以收到很多请求,但是我预计不会同时收到数十个请求。但是处理任务可能要花费很多时间(小时...天)

我不想等待RabbitMq消息停留那么长时间-如果检索到该消息,则可以确认该消息。

在这种情况下,是否只是通过Task.Run()启动新线程?

我曾考虑在内部Queue中排队消息,但在Linux Net内核上找不到好的解决方案。

当前代码如下:

        public async Task StartAsync(CancellationToken cancellationToken)
                {
                    _logger.LogInformation($"Starting 
     nameof(NewTaskHandlerService)}");
          await _rabbit.SubscribeAsync<CalculationTask>(async (message) =>
                    {
                        _logger.LogInformation($"New Task: {message.InstanceId}");
                        try
                        {
// this can take ages, I want to start this independently
                            Task.Run(async () =>
                            {
                                using (var scope = _services.CreateScope())
                                {
                                    var scopedProcessingService =
                                        scope.ServiceProvider
                                            .GetRequiredService<ICalculationTaskHandler>();

                                    await scopedProcessingService.StartCalculationTask(message);

                                }
                            });

                            return new Ack();

                        }
                        catch (Exception e)
                        {
                            _logger.LogError(0, e, "Error while handling new task. Marking Workflow {} task {} as failed",
                                message.ParentCalculationId, message.InstanceId);
                            return new Nack(true);
                        }
                    });
        }

1 个答案:

答案 0 :(得分:2)

每次收到消息时都开始使用新的Task会有弊端

  1. 这是不可靠的,如果您收到太多消息,那么很多Task将会溢出内存,而应用程序只会崩溃。
  2. 没有实时的消息状态视图,当前正在处理多少消息,失败了,成功了。
  3. 无法重试处理失败的消息。
  4. 即时处理邮件,一段时间后无法处理(例如每晚处理)

使用HangfireQuartz.NET,它们将逐渐在后台处理消息(具有其他好处,例如重试等)