Learning SynchronizationContext, async, dan tunggu

Pengaturcaraan tak segerak adalah bentuk pengaturcaraan selari yang membolehkan anda melaksanakan tugas yang terpisah dari utas aplikasi utama dan kemudian memberitahu utas apabila pelaksanaannya selesai. Asynchrony membantu anda melaksanakan tugas tanpa perlu menahan aliran pelaksanaan atau respons aplikasi anda.

Microsoft telah memberikan sokongan untuk pengaturcaraan selari dalam .Net Framework untuk memanfaatkan kelebihan sistem pelbagai teras. Anda boleh memanfaatkan asinkron untuk meningkatkan prestasi dan responsif aplikasi anda.

Pada dasarnya, terdapat dua kemungkinan jenis operasi dalam aplikasi. Ini termasuk operasi terikat komputasi dan I / O. Operasi terikat komputasi adalah operasi di mana pengiraan dapat dilakukan pada utas yang terpisah sehingga utas utama dapat dilanjutkan dengan pelaksanaannya. Sebaliknya, operasi terikat I / O adalah operasi yang dijalankan secara luaran dan oleh itu mereka tidak perlu menyekat utas semasa semasa I / O sedang berlangsung.

Konteks penyegerakan dan konteks pelaksanaan

Setiap utas mempunyai konteks yang berkaitan dengannya - ini juga dikenali sebagai konteks "semasa" - dan konteks ini dapat dikongsi di seluruh utas. ExecutionContext mengandungi metadata yang relevan dari persekitaran semasa atau konteks di mana program ini dijalankan. SynchronizationContext mewakili abstraksi - ini menunjukkan lokasi di mana kod aplikasi anda dijalankan.

SynchronizationContext membolehkan anda mengantri tugas ke konteks lain. Perhatikan bahawa setiap utas boleh mempunyai SynchronizatonContext sendiri. Kelas SynchronizationContext telah ditambahkan baru-baru ini ke Sistem. Menerangkan ruang nama dan memudahkan komunikasi antara utas. Anda boleh membaca lebih lanjut mengenai SynchronizationContext dan ExecutionContext di sini.

Penyelaman mendalam di dalam Async dan Await

Tiga corak pengaturcaraan tak segerak merangkumi yang berikut:

  1. Model Pengaturcaraan Asinkron (APM)
  2. Corak Asinkron Berasaskan Acara (EAP)
  3. Pola Asinkron Berasaskan Tugas (TAP)

Yang terbaru, yang disyorkan dan juga yang paling elegan dari semua ini adalah TAP.

Perhatikan bahawa anda boleh menandakan kaedah menggunakan kata kunci "async" yang mengembalikan kekosongan, Tugas, atau Tugas. Perhatikan bahawa apabila pengecualian berlaku di dalam kaedah asinkron yang mempunyai jenis tugas atau tugas kembali, butiran pengecualian disimpan di dalam instance Task.

Sebaliknya, apabila pengecualian berlaku dalam kaedah asinkron yang mempunyai jenis kekosongan pengembalian, butiran pengecualian disimpan di dalam SynchronizationContext yang aktif pada masa kaedah asinkron dipanggil. Pada hakikatnya, anda tidak dapat menangani pengecualian yang dikemukakan dalam kaedah tak segerak yang mempunyai jenis pengembalian kekosongan menggunakan pengendali pengecualian yang ditulis di dalam kaedah tak segerak. Kerana semantik pengkomputeran dan pengendalian ralat yang berbeza, disarankan untuk mengelakkan kaedah tak segerak yang mempunyai jenis pengembalian yang tidak sah kecuali ada alasan yang mencukupi untuk menggunakannya.

Apabila anda menggunakan kata kunci "tunggu" di dalam kaedah tidak segerak, kaedah tersebut akan dipecah di dalam mesin keadaan. Perhatikan bahawa kata kunci "tunggu" menangkap SynchronizationContext semasa dan sebaik sahaja tugas yang telah ditunggu menggunakan kata kunci "tunggu" selesai, mesin keadaan disambung semula dan pelaksanaan kod dalam kaedah pemanggil dimulakan semula - ini juga dikenali sebagai kesinambungan. Sekiranya pelaksanaan kod yang telah ditunggu menggunakan kata kunci "tunggu" telah selesai pada saat titik penangguhan ditemui, kaedah asinkron (kaedah yang telah ditandai sebagai "async") dijalankan secara serentak. Sekiranya pelaksanaan kod yang telah ditunggu tidak lengkap, perwakilan lanjutan dilampirkan pada kod yang telah ditunggu.

Anda boleh memanfaatkan kaedah tak segerak yang tidak sah untuk membuat pengendali acara tidak segerak. Kaedah Utama tidak dapat ditandai dengan kata kunci "async" kerana ia adalah titik masuk aplikasi - kaedah Utama "async" akan menghentikan saat ia dipanggil. Kata kunci "tunggu" memberitahu penyusun bahawa kaedah tersebut boleh mempunyai titik penggantungan dan penyambungan semula. Secara kebetulan, anda boleh menggunakan kata kunci "tunggu" hanya pada kaedah yang telah ditandakan sebagai tidak segerak menggunakan kata kunci "tidak segerak".

Kaedah async apabila dipanggil, berjalan serentak pada utas semasa tanpa mengira jenis kaedah kembali. Apabila anda menandakan kaedah sebagai tidak segerak menggunakan kata kunci "async", anda hanya memberitahu penyusun bahawa kaedah tersebut dapat dibahagikan kepada beberapa tugas - beberapa tugas ini dapat dilaksanakan secara tidak segerak. Juga, penyertaan kata kunci "async" dalam kaedah tidak mengantarkan pemanggilan kaedah sebagai bahagian dari kumpulan utas. Asinkron (iaitu, sama ada kaedah mempunyai tingkah laku tidak segerak) sebenarnya bergantung pada titik penggantungan yang telah anda nyatakan dalam kaedah anda menggunakan kata kunci "tunggu". Sekiranya anda tidak memasukkan kata kunci "tunggu" di dalam kaedah tidak segerak, keseluruhan kaedah akan dilaksanakan secara serentak.