Bagikan melalui


BackgroundService menjalankan semua ExecuteAsync sebagai Tugas

BackgroundService sekarang menjalankan keseluruhan ExecuteAsync pada utas latar belakang. Sebelumnya, bagian sinkron dari ExecuteAsync (sebelum yang pertama await) berjalan pada utas utama selama startup layanan, menghalangi layanan lain untuk memulai. Hanya kode setelah yang pertama await dijalankan pada utas latar belakang.

Versi yang diperkenalkan

.NET 10

Perilaku sebelumnya

Sebelumnya, bagian sinkron berjalan ExecuteAsync pada utas utama dan memblokir layanan lain agar tidak dimulai.

Perilaku baru

Mulai dari .NET 10, semua ExecuteAsync dijalankan pada utas latar belakang, dan tidak ada bagiannya yang memblokir layanan lain untuk memulai.

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku.

Alasan perubahan

Perilaku sebelumnya adalah perangkap umum yang tidak memenuhi harapan pengguna. Sebagian besar pelaksana BackgroundService tidak memahami bahwa bagian yang berjalan secara sinkron sebelum await pertama kali menghambat layanan lain untuk memulai selama proses startup aplikasi.

Jika Anda memerlukan bagian mana pun dari Anda BackgroundService.ExecuteAsync untuk dijalankan sebelumnya selama startup (secara sinkron dan memblokir layanan lain), Anda dapat melakukan salah satu hal berikut:

  • Tempatkan kode yang perlu dijalankan secara sinkron di konstruktor, dan dijalankan sebagai bagian dari konstruksi layanan.
  • Ambil alih StartAsync dan lakukan beberapa pekerjaan sebelum memanggil base.StartAsync. StartAsync mempertahankan perilaku di mana bagian sinkronnya berjalan selama startup dan memblokir pengaktifan layanan lain.
  • Jika Anda ingin menjalankan kode pada waktu yang lebih spesifik selama startup layanan, terapkan Microsoft.Extensions.Hosting.IHostedLifecycleService pada Anda BackgroundService.
  • Lewati BackgroundService sepenuhnya dan implementasikan Microsoft.Extensions.Hosting.IHostedService sendiri.

API yang terpengaruh