中止 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.
在服务的启动阶段,我们启动 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.