Heim > Backend-Entwicklung > C++ > Wie kann ich eine asynchronisierte Methode aussetzen, bis ein Ereignis auftritt?

Wie kann ich eine asynchronisierte Methode aussetzen, bis ein Ereignis auftritt?

DDD
Freigeben: 2025-01-29 16:51:11
Original
253 Leute haben es durchsucht

How to Suspend an Async Method Until an Event Occurs?

effizient pausieren asynchronen Vorgänge, die auf die Benutzereingabe warten

asynchrones Programmieren erfordert häufig eine Pause von langjährigen Aufgaben bis zur Benutzerinteraktion, wie z. B. einen Schaltflächenklick. In diesem Artikel werden effiziente Alternativen zum Beschäftigungswesen untersucht, wenn eine asynchronisierte Methode wie GetResults bis ein bestimmtes Ereignis ausgelöst wird.

vermeiden ineffiziente Umfragen

Der traditionelle Ansatz der kontinuierlichen Überprüfung des Ereignisses (geschäftiges Packen) ist sehr ineffizient. Ereignisgesteuerte Lösungen bieten einen eleganteren und leistungsfähigeren Ansatz.

Semaphoreslim zur Synchronisation

verwenden

Die SemaphoreSlim -Klasse bietet eine robuste semaphorbasierte Lösung. Initialisieren Sie ein Semaphor mit einer Startanzahl von 0 und einer maximalen Anzahl von 1. Der Ereignishandler für die Schaltfläche "Weiter" fördert das Semaphor mit Release(). Innerhalb GetResults blockiert await signal.WaitAsync() die Ausführung, bis das Semaphor veröffentlicht wird.

<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>
Nach dem Login kopieren

TaskCompletionsource für die Ereignissignalisierung

nutzen

Alternativ erstellt TaskCompletionSource<bool> eine Aufgabe, die die Schaltfläche Klickergebnis darstellt. Der Event -Handler erledigt diese Aufgabe mit SetResult(). GetResults wartet auf diese Aufgabe und speichern die Ausführung bis zum Abschluss.

<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>
Nach dem Login kopieren

Diese ereignisgesteuerten Methoden bieten eine saubere und effiziente Möglichkeit, asynchronisierte Methoden auf der Grundlage von Benutzerereignissen innehalten und wieder aufzunehmen.

Das obige ist der detaillierte Inhalt vonWie kann ich eine asynchronisierte Methode aussetzen, bis ein Ereignis auftritt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage