在服务的启动阶段,我们启动MassTransitClient订阅。启动在后台线程上运行。
void Startup()
{
...
var busProvider = serviceProvider.Get<IBusProvider>();
busProviderLaunchTask = busProvider.StartAsync();
tokenSource = new CancellationTokenSource();
busProviderLaunchTask.Wait(busProviderTokenSource.Token);
}
有一个Stop()方法可在完成清理后停止托管服务。问题是服务过早停止-启动代码尚未完成-我们需要确保busProvider已停止。第一个问题是busProvider.StartAsync()挂了一段时间-如何中止?中止后台线程可以解决所有问题-但是busProvider有很多例外。另外,由于我们不知道哪些初始化成功以及哪些没有初始化,因此Stop方法的清除变得不确定。
当我们真正想要停止时,等待整个开始完成的时间太长。这些挂起了:busProvider.StartAsync()busProviderLaunchTask.Wait()
如您所见,已经做了一些提供CancellationSource的尝试,但这都是很原始的。
一般有什么想法吗?具体来说,我们可以过早关闭busProvider吗?
将取消令牌传递给StartAsync(CancellationToken cancellationToken)
。