Membedah Aliran Kawalan yield
dan await
dalam .NET
yield
dan await
ialah ciri .NET asas yang membolehkan aliran kawalan yang canggih dan pengaturcaraan tak segerak. Walau bagaimanapun, mekanisme asasnya boleh menjadi rumit.
await
: Mendalangi Pelaksanaan Serentak
Bertentangan dengan pelaksanaan berulir, await
bijak menguruskan aliran kawalan melalui langkah-langkah ini:
Memahami Gaya Lulus Sambungan
await
sangat bergantung pada 'gaya hantaran berterusan.' Apabila ditemui, perwakilan yang mewakili kesinambungan kod selepas tugas selesai dijana. Perwakilan ini memegang:
Mengekalkan Rekod Pengaktifan
Daripada membuang rekod pengaktifan (bingkai tindanan) pada await
, .NET dengan bijak memindahkannya ke timbunan. Ini penting kerana operasi tak segerak tidak selalu mengikut corak pelaksanaan berasaskan tindanan yang ketat.
Pengendalian Pengecualian dan Pembukaan Tindanan
Pengendalian pengecualian dengan await
adalah bernuansa. Pengecualian yang tidak dikendalikan dalam tugasan yang ditunggu-tunggu ditangkap dan dibaling semula apabila keputusan tugasan itu diambil semula.
yield
dan Kesan Pelaksanaannya
yield
mentakrifkan iterator, berkongsi persamaan dengan await
. Dalam blok lelaran, yield
:
yield
pada seruan lelaran berikutnya.Pemeliharaan Negeri dengan yield
Serupa dengan await
, yield
menggunakan rekod pengaktifan berasaskan timbunan. Apabila menemui yield
, keadaan semasa, termasuk penuding arahan untuk panggilan MoveNext
seterusnya, disimpan pada timbunan.
Penerokaan Selanjutnya
Pemahaman menyeluruh tentang kelas penutupan dalam ungkapan lambda adalah penting untuk memahami pelaksanaan terperinci yield
dan await
. Banyak sumber, termasuk tulisan Eric Lippert, menawarkan penjelasan mendalam tentang mekanik .NET mereka.
Atas ialah kandungan terperinci Bagaimanakah `hasil` dan `menunggu` Mengawal Aliran Program Asynchronous dalam .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!