中止 MassTransit StartAsync

Abort MassTransit StartAsync

在服务的启动阶段,我们启动 MassTransitClient 订阅。 启动在后台线程上运行。

void Startup()
{
 ...
  var busProvider = serviceProvider.Get<IBusProvider>();
  busProviderLaunchTask = busProvider.StartAsync();
  tokenSource = new CancellationTokenSource();
  busProviderLaunchTask.Wait(busProviderTokenSource.Token);
}

有一个 Stop() 方法可以停止已完成清理的托管服务。 问题是服务过早停止时 - 启动代码尚未完成 - 我们需要确保 busProvider 已停止。 第一个问题是 busProvider.StartAsync() 挂起一段时间 - 如何中止? 中止后台线程可以解决所有问题——但是 busProvider 有很多例外。 此外,Stop 方法的清理变得不确定,因为我们不知道什么成功初始化,什么失败。

等待整个 Start 完成,当我们真正想要 Stop 时,时间太长了。 这些是挂着的: busProvider.StartAsync() busProviderLaunchTask.Wait()

如您所见,已尝试提供 CancelationSource,但都非常原始。

一般有什么想法吗? 具体来说,我们可以提前关闭 busProvider 吗?

将取消令牌传递给 StartAsync(CancellationToken cancellationToken)

如果您取消令牌,它会取消 StartAsync 调用(可能需要一些时间,但它会取消)。

此外,请遵守 async 规则——使用 .Wait() 会导致各种问题。

你可以使用TaskUtil.Await(() => bus.StartAsync(), cancellationToken),等待比调用.Wait()好一点,不幸的是启动代码通常是异步的。这就是 bus.Start() 在幕后所做的。

TaskUtil is part of MassTransit.Util namespace.