Pertimbangkan contoh kod berikut:
private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await }
Dalam contoh ini, apabila kata kunci await ditemui dalam MyAsyncMethod(), kawalan kembali ke MyMethod(). Walau bagaimanapun, benang tidak dikunci kerana tugas. Tunggu(). Sebaliknya, kesinambungan (kod berikut menunggu) dilaksanakan pada urutan yang berbeza.
Operator menunggu menggunakan konteks penyegerakan, yang menentukan cara kesinambungan harus dilaksanakan. Secara lalai, jika pemanggil berjalan pada urutan UI, kesinambungan juga dilaksanakan pada urutan UI. Ini membolehkan penyepaduan yang lancar dengan operasi UI.
Walau bagaimanapun, jika pemanggil berjalan pada urutan kumpulan benang, kesinambungan mungkin dilaksanakan pada urutan kumpulan benang yang berbeza. Ini kerana utas kumpulan benang tidak bertujuan untuk dikhususkan kepada tugas tertentu dan boleh digunakan untuk berbilang operasi serentak.
Adalah penting untuk ambil perhatian bahawa kelakuan pengendali menunggu boleh diubah suai menggunakan kaedah ConfigureAwait. Kaedah ini membolehkan anda menentukan sama ada kesinambungan harus dijalankan pada utas yang sama atau berbeza.
Sebagai contoh, jika anda tidak mahu kesinambungan dijalankan pada utas yang sama dan sebaliknya dijalankan pada utas kumpulan benang:
await task.ConfigureAwait(false);
Dengan memahami cara konteks penyegerakan berfungsi, anda boleh mengurus pelaksanaan utas dengan berkesan dalam kod tak segerak dan menghalang kemungkinan penguncian isu.
Atas ialah kandungan terperinci Apa yang Berlaku pada Pelaksanaan Thread Selepas Kata Kunci `menunggu` dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!