Jika saya membuat utas baru seperti ini:

Thread thread = new Thread(.....);
thread.Start(......);

Apa yang terjadi jika metode di dalam utas itu menggunakan operator await? Saya mengerti bahwa dalam skenario normal ini akan menyebabkan .Net menyimpan status eksekusi saat ini dan mengembalikan utas ke kumpulan utas sehingga dapat bekerja pada sesuatu yang lain sementara kami menunggu metode yang ditunggu selesai, tetapi bagaimana jika ini tidak dalam utas kumpulan utas untuk memulai?

0
Josh 13 Mei 2021, 06:54

2 jawaban

Jawaban Terbaik

Saya mengerti bahwa dalam skenario normal ini akan menyebabkan .Net menyimpan status eksekusi saat ini dan mengembalikan utas ke kumpulan utas sehingga dapat bekerja pada sesuatu yang lain sementara kami menunggu metode yang ditunggu selesai, tetapi bagaimana jika ini tidak dalam utas kumpulan utas untuk memulai?

Untuk mengklarifikasi sedikit, await akan menghemat keadaan lokal dan kemudian kembali. Itu tidak langsung menyerah.

Jadi, dalam kasus ini, jika metode utama Thread kembali, maka utas tersebut akan keluar. Itu tidak dikembalikan ke kumpulan utas karena itu bukan utas kumpulan utas; itu hanya keluar karena proc utasnya kembali.

Ada juga skenario lain:

  • Jika utas adalah utas UI, maka utas itu kembali ke loop pesannya. Utas terus berjalan, memproses pesan lain.
  • Jika utas adalah utas utama aplikasi Konsol, maka utas tersebut akan keluar, yang menyebabkan aplikasi Konsol keluar.

Apa yang terjadi jika metode di dalam utas itu menggunakan operator menunggu?

Sama seperti waktu lain await digunakan:

  • await menangkap "konteks" (SynchronizationContext.Current atau TaskScheduler.Current). Dalam hal ini, konteksnya adalah konteks kumpulan utas.
  • Ketika metode siap untuk melanjutkan, itu dilanjutkan pada konteks itu.

Jadi dalam hal ini, await akan kembali, menyebabkan utas keluar. Kemudian nanti, sisa metode akan berjalan di thread pool thread.

1
Stephen Cleary 13 Mei 2021, 11:01

Jika Anda "membuat" utas, Anda "mengelolanya".

Setelah kode yang dijadwalkan untuk dijalankan pada utas itu selesai, utas akan dihancurkan.

Jika Anda menjalankan kode async/menunggu pada utas yang Anda buat, kemungkinan Anda akan segera kehabisan utas itu dan membayar harga untuk membuat dan menghancurkan utas tanpa manfaat.

Kumpulan utas digunakan untuk menjadwalkan kode berumur pendek dan, dengan async/menunggu itu adalah norma.

Jika Anda memiliki beberapa kode yang berjalan lama yang memblokir, maka mungkin lebih baik untuk membuat utas Anda sendiri.

1
Paulo Morgado 13 Mei 2021, 10:06