FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

Zum einen muss die Funktion, die orchestriert, eine Netzwerkanforderung zu erstellen und das Ergebnis anzuzeigen (loadData im obigen Beispiel), auch den spezifischen Mechanismus kennen, wie eine Netzwerkanforderung abgebrochen werden kann. Ich weiß nichts über Sie, aber die Anwendungen, an denen ich arbeite, haben in der Regel viele verschiedene Funktionen, die Daten laden. So können Sie am Ende die gleiche Abbruchlogik immer wieder wiederholen. Es gibt zwei Seiten, die Sie vielleicht umsetzen möchten: 1. Hören auf die Absage-Veranstaltung 1. Emittieren des Abbruchereignisses Es ist eine wichtige Kontextbedingung mit diesem Muster verbunden: Die Löschung eines ausgeführten Falls muss als erfolgloser Abschluss der Anfrage angesehen werden. Dies bedeutet, dass, obwohl der Fall in geordneter Weise beendet wurde, vielleicht sogar mit Token, die ihren Endpunkt erreichen, dies in keiner Weise als ein erfolgreiches Ergebnis interpretiert werden sollte. Wenn z. B. ein Protokoll von Ereignissen gespeichert wird, die während der Prozessausführung auftreten, sollte die Anfrage als unvollständig oder abgebrochen aufgezeichnet werden. Die Laufzeit verwendet Ausnahmebehandlung, um den Abbruch zu implementieren.

Fangen oder behandeln Sie diese Ausnahmen in Ihrem Code nicht. Darüber hinaus wird empfohlen, für Ihre Aufgaben ausnahmesicheren Code in die Funktionskörper zu schreiben. Sie können z. B. das RAII-Muster (Resource Acquisition Is Initialization) verwenden, um sicherzustellen, dass Ressourcen ordnungsgemäß behandelt werden, wenn eine Ausnahme im Hauptteil eines Vorgangs ausgelöst wird. Ein vollständiges Beispiel, das das RAII-Muster zum Bereinigen einer Ressource in einem abbruchfähigen Vorgang verwendet, finden Sie unter Exemplarische Vorgehensweise: Entfernen von Arbeit aus einem Benutzeroberflächenthread. In Abbildung 29 wird ein alternatives Schema dargestellt, in dem jedem Staat eine Reihe von Abbruchübergängen zugeordnet ist (dargestellt durch C1, C2 … usw.). Wenn der Abbruch initiiert wird, werden diese Übergänge für ein sehr kurzes Zeitintervall aktiviert (im Wesentlichen die Differenz zwischen Zeit t und t + Epsilon, wobei Epsilon ein Zeitintervall ist, das sich Null nähert), wodurch ein sofortiger Abbruch für einen bestimmten Zustand erfolgt, der die potenziellen Deadlocks vermeidet, die mit dem Ansatz in Abbildung 28 auftreten könnten. Sie können dem Konstruktor eines task_group oder structured_task_group Objekts auch ein Abbruchtoken bereitstellen. Ein wichtiger Aspekt dabei ist, dass untergeordnete Aufgabengruppen dieses Abbruchtoken erben. Ein Beispiel, das dieses Konzept anhand der Funktion concurrency::run_with_cancellation_token veranschaulicht, um parallel_for aufzurufen, finden Sie weiter unten in diesem Dokument unter Abbrechen paralleler Algorithmen.

Dieser Code unterstützt (noch) keine Stornierung. Es wäre schön, wenn wir das cancelFetchOnReentry-Muster hier wiederverwenden könnten. Wenn Sie jedoch genau auf die neue loadData-Funktionssignatur achten, wird möglicherweise das Problem damit angezeigt. Wenn eine untergeordnete Aufgabe einen zeitaufwändigen Vorgang ausführt und die Laufzeit nicht aufruft, muss sie regelmäßig rechtzeitig nach Abbruch und Beenden suchen. Das folgende Beispiel zeigt eine Möglichkeit, um zu bestimmen, wann die Arbeit abgebrochen wird. Aufgabe t4 bricht die übergeordnete Aufgabengruppe ab, wenn ein Fehler auftritt. Task t5 ruft gelegentlich die structured_task_group::is_canceling Methode auf, um nach einem Abbruch zu suchen. Wenn die übergeordnete Aufgabengruppe abgebrochen wird, druckt Aufgabe t5 eine Nachricht und wird beendet. Dieses dritte Beispiel ähnelt dem zweiten Beispiel, mit der Ausnahme, dass Aufgabe t4 eine Ausnahme auslöst, um die Aufgabengruppe tg2 abzubrechen.

In diesem Beispiel wird ein try-catch-Block verwendet, um nach einem Abbruch zu suchen, wenn die Aufgabengruppe tg2 auf den Abschluss ihrer untergeordneten Aufgaben wartet. Wie im ersten Beispiel führt dies dazu, dass die Aufgabengruppe tg2 in den abgebrochenen Zustand eingibt, aber die Aufgabengruppe tg1 wird nicht abgebrochen. Die Stornierung ist kooperativ und umfasst die Koordination zwischen dem Code, der die Stornierung anfordert, und der Aufgabe, die auf die Stornierung reagiert.