Dalam fase startup layanan, kami memulai langganan MassTransitClient. Startup berjalan di utas latar belakang.

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

Ada metode Stop() untuk menghentikan layanan yang dihosting tempat pembersihan dilakukan. Masalahnya adalah ketika layanan dihentikan sebelum waktunya - kode startup belum selesai - kita perlu memastikan busProvider dihentikan. Masalah pertama adalah busProvider.StartAsync() hang beberapa saat - bagaimana cara membatalkannya? Membatalkan utas latar belakang menyelesaikan segalanya - tetapi ada banyak pengecualian dari busProvider. Juga pembersihan metode Stop menjadi tidak pasti karena kami tidak tahu apa yang berhasil diinisialisasi dan apa yang tidak.

Menunggu seluruh Mulai selesai, ketika kita benar-benar ingin Berhenti terlalu lama. Ini tergantung: busProvider.StartAsync() busProviderLaunchTask.Wait()

Seperti yang Anda lihat, beberapa upaya untuk menyediakan CancelationSource dilakukan, tetapi semuanya cukup mentah.

Ada ide secara umum? Secara khusus, bisakah kita mematikan busProvider sebelum waktunya?

0
Nickolodeon 20 Maret 2020, 15:08

1 menjawab

Jawaban Terbaik

Berikan token pembatalan ke StartAsync(CancellationToken cancellationToken).

Jika Anda membatalkan token, itu akan membatalkan panggilan StartAsync (ini bisa memakan waktu beberapa saat, tetapi akan dibatalkan).

Selain itu, patuhi aturan async – menggunakan .Wait() itu akan menyebabkan semua jenis masalah.

Anda dapat menggunakan TaskUtil.Await(() => bus.StartAsync(), cancellationToken), yang menunggu sedikit lebih baik daripada memanggil .Wait(), sayangnya kode startup sering kali tidak sinkron. Itulah yang dilakukan bus.Start() di balik selimut.

TaskUtil adalah bagian dari namespace MassTransit.Util.

0
Nickolodeon 23 Maret 2020, 16:32