Прервать MassTransit StartAsync - PullRequest
0 голосов
/ 20 марта 2020

На этапе запуска сервиса мы запускаем подписки MassTransitClient. Запуск запускается в фоновом потоке.

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

Существует метод Stop () для остановки размещенной службы, в которой выполняется очистка. Проблема в том, что служба останавливается преждевременно - код запуска еще не завершен - мы должны убедиться, что busProvider остановлен. Первая проблема заключается в том, что busProvider.StartAsyn c () некоторое время зависает - как его можно прервать? Прерывание фонового потока решает все проблемы, но есть много исключений из busProvider. Кроме того, очистка метода Stop становится неопределенной c, поскольку мы не знаем, что удалось инициализировать, а что нет.

Ожидание всего начала до конца sh, когда мы действительно хотим остановить, слишком долго. , Они висят: busProvider.StartAsyn c () busProviderLaunchTask.Wait ()

Как видите, предпринята некоторая попытка предоставить CancelationSource, но все это довольно сыро.

Любые идеи в общем? В частности, можем ли мы преждевременно отключить busProvider?

1 Ответ

0 голосов
/ 20 марта 2020

Передайте токен отмены на StartAsync(CancellationToken cancellationToken).

Если вы отмените токен, он отменит вызов StartAsync (это может занять несколько минут, но он будет отменен).

Кроме того, соблюдайте правила asyn c - использование этого .Wait () вызовет всевозможные проблемы.

Вы можете использовать TaskUtil.Await(() => bus.StartAsync(), cancellationToken), что немного лучше чем вызов .Wait (), к сожалению, код запуска часто асин c. Вот что делает bus.Start () под одеялом.

TaskUtil является частью пространства имен MassTransit.Util.

...