Heim >Backend-Entwicklung >C++ >Wie kann ich eine asynchronisierte Methode aussetzen, bis ein Ereignis auftritt?
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>
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>
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!