Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk menggantung kaedah async sehingga peristiwa berlaku?

Bagaimana untuk menggantung kaedah async sehingga peristiwa berlaku?

DDD
Lepaskan: 2025-01-29 16:51:11
asal
253 orang telah melayarinya

How to Suspend an Async Method Until an Event Occurs?

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>
Salin selepas log masuk

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>
Salin selepas log masuk
Kaedah yang didorong oleh peristiwa ini menawarkan cara yang bersih dan cekap untuk menjeda dan menyambung semula kaedah async berdasarkan peristiwa pengguna, menghapuskan overhead prestasi yang sibuk.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan