Mekanisme aliran kawalan yield
dan await
dalam .NET
Pemahaman anda tentang yield
dan await
kata kunci dalam .NET secara amnya betul. yield
Membenarkan blok lelaran mengembalikan kawalan kepada kod panggilan dan menyambung semula pelaksanaan di tempat ia berhenti apabila lelaran dipanggil semula. await
Bukan sahaja menunggu pemanggil selesai, tetapi juga mengembalikan kawalan kepada pemanggil. Apabila pemanggil await
kaedah sekali lagi, pelaksanaan akan disambung semula di tempat ia berhenti.
Kunci untuk memahami struktur ini terletak pada mekanisme pelaksanaannya. Untuk await
, ia pada asasnya bersamaan dengan "pulangan tahap tinggi". Apabila ungkapan await
ditemui, masa jalan menyemak sama ada tugasan telah selesai. Jika tidak selesai, ia memperuntukkan perwakilan, melaksanakan baki kaedah sebagai kesinambungan tugas dan mengembalikannya kepada pemanggil. Jika tugas selesai, baki kaedah dilaksanakan serta-merta.
await
mengandungi nombor yang mengenal pasti penunjuk arahan seterusnya untuk dilaksanakan dalam jadual carian. Ini memastikan bahawa apabila tugas disambung semula, ia meneruskan pelaksanaan dari lokasi yang betul. Kesinambungan juga menyimpan nilai semua pembolehubah tempatan dan sementara, membenarkan kaedah untuk menyambung semula pelaksanaan seolah-olah ia tidak pernah diganggu.
Bagi persoalan bagaimana masa jalan mengendalikan berbilang panggilan kaedah sebelum await
, jawapannya ialah rekod pengaktifan pemanggil dan rekod pengaktifan kaedah yang dipanggilnya tidak disimpan dalam timbunan yang sama. Sebaliknya, await
maklumat yang berkaitan untuk pemulihan disimpan pada timbunan. Ini memastikan bahawa timbunan tidak ditimpa oleh panggilan kaedah berikutnya.
Jika pengecualian yang tidak dikendalikan berlaku, ia ditangkap dan disimpan dalam tugasan. Pengecualian ini akan dibaling semula apabila keputusan tugasan diperolehi. Tingkah laku ini memastikan bahawa pengecualian dikendalikan dengan betul walaupun dengan kehadiran operasi tak segerak.
Prinsip yang sama digunakan untuk pelaksanaan yield
. Apabila iterator menyekat yield
nilai, keadaan pembolehubah tempatan disalin ke timbunan, bersama-sama dengan nombor yang menunjukkan arahan MoveNext
yang harus menyambung semula pelaksanaan pada kali berikutnya iterator dipanggil. Ini membolehkan iterator menjeda pelaksanaan pada titik yield
dan menyambung semula pelaksanaan kemudian tanpa kehilangan sebarang keadaan.
Dengan memanfaatkan mekanisme kompleks ini, kata kunci yield
dan await
menyediakan cara yang berkesan untuk melaksanakan operasi tak segerak dan berulang dalam .NET. Mereka membenarkan simulasi konkurensi tanpa memerlukan benang, memudahkan kod dan meningkatkan prestasi.
Atas ialah kandungan terperinci Bagaimana `menghasilkan` dan `menunggu` Mengurus Aliran Kawalan dalam .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!