Operasi Async dengan cekap menunggu input pengguna
Pengaturcaraan Asynchronous sering memerlukan berhenti tugas lama sehingga interaksi pengguna, seperti klik butang. Artikel ini meneroka alternatif yang cekap untuk menunggu sibuk apabila menggantung kaedah async seperti sehingga peristiwa tertentu mencetuskan. GetResults
Mengelakkan pengundian yang tidak cekap
Pendekatan tradisional secara berterusan memeriksa acara (sibuk-undian) sangat tidak cekap. Penyelesaian yang didorong oleh acara memberikan pendekatan yang lebih elegan dan pelaku.
menggunakan semaphoreslim untuk penyegerakan
Kelas menyediakan penyelesaian berasaskan semaphore yang mantap. Mulakan semaphore dengan kiraan permulaan 0 dan kiraan maksimum 1. Pengendali acara untuk butang "Teruskan" melepaskan semaphore menggunakan SemaphoreSlim
. Dalam Release()
, GetResults
pelaksanaan blok sehingga semaphore dibebaskan. await signal.WaitAsync()
<code class="language-csharp">private SemaphoreSlim signal = new SemaphoreSlim(0, 1); private void ButtonContinue_Click(object sender, RoutedEventArgs e) { signal.Release(); } private async Task GetResults() { await signal.WaitAsync(); // Continue processing }</code>
memanfaatkan TaskCompletionsource untuk isyarat acara
Sebagai alternatif, mencipta tugas yang mewakili hasil klik butang. Pengendali acara melengkapkan tugas ini menggunakan TaskCompletionSource<bool>
. SetResult()
menanti tugas ini, menggantung pelaksanaan sehingga selesai. GetResults
<code class="language-csharp">private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); private void ButtonContinue_Click(object sender, RoutedEventArgs e) { tcs.SetResult(true); } private async Task GetResults() { await tcs.Task; // Continue processing }</code>
Atas ialah kandungan terperinci Bagaimana untuk menggantung kaedah async sehingga peristiwa berlaku?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!