Gründe für das Implementieren des ereignisbasierten asynchronen Musters
Aktualisiert: November 2007
Das ereignisbasierte asynchrone Muster stellt ein Muster bereit, mit dem das asynchrone Verhalten einer Klasse verfügbar gemacht werden kann. Mit diesem Muster definiert .NET Framework zwei Muster zum Verfügmachen des asynchronen Verhaltens: das auf der System.IAsyncResult-Schnittstelle beruhende asynchrone Muster und das ereignisbasierte Muster. In diesem Thema werden Gründe für die Implementierung beider Muster erläutert.
Weitere Informationen über asynchrone Programmierung mit der IAsyncResult-Schnittstelle finden Sie unter Entwurfsmuster für die asynchrone Programmierung.
Allgemeine Prinzipien
Asynchrone Features sollten nach Möglichkeit mit dem ereignisbasierten asynchronen Muster verfügbar gemacht werden. Das ereignisbasierte Muster kann einige Anforderungen jedoch nicht erfüllen. In diesen Fällen müssen Sie möglicherweise neben dem ereignisbasierten Muster auch das IAsyncResult-Muster implementieren.
Hinweis: |
---|
Das IAsyncResult-Muster wird nur selten ohne das ereignisbasierte Muster implementiert. |
Richtlinien
In der folgenden Liste werden Richtlinien für die Implementierung des ereignisbasierten asynchronen Musters beschrieben:
Verwenden Sie das ereignisbasierte Muster als Standard-API, um asynchrones Verhalten für die Klasse verfügbar zu machen.
Machen Sie das IAsyncResult-Muster nicht verfügbar, wenn die Klasse in erster Linie in einer Clientanwendung wie Windows Forms verwendet wird.
Machen Sie das IAsyncResult-Muster nur verfügbar, wenn es im Rahmen ihrer Arbeit notwendig ist. So müssen Sie das IAsyncResult-Muster möglicherweise aus Gründen der Kompatibilität mit einer vorhandenen API verfügbar machen.
Machen Sie das IAsyncResult-Muster nur zusammen mit dem ereignisbasierten Muster verfügbar.
Machen Sie das IAsyncResult-Muster, wenn es verfügbar gemacht werden muss, als erweiterte Option verfügbar. Wenn Sie z. B. ein Proxyobjekt generieren, generieren Sie standardmäßig das ereignisbasierte Muster mit der Option, das IAsyncResult-Muster zu generieren.
Erstellen Sie die Implementierung des ereignisbasierten Musters auf der Grundlage der Implementierung des IAsyncResult Musters.
Machen Sie das ereignisbasierte Muster und das IAsyncResult-Muster nach Möglichkeit nicht für die gleiche Klasse verfügbar. Machen Sie das ereignisbasierte Muster für Klassen auf "höherer Ebene" und das IAsyncResult-Muster für Klassen auf "niedrigerer Ebene" verfügbar. Vergleichen Sie z. B. das ereignisbasierte Muster für die WebClient-Komponente mit dem IAsyncResult-Muster für die HttpRequest-Klasse.
Machen Sie das ereignisbasierte Muster und das IAsyncResult-Muster für die gleiche Klasse verfügbar, wenn dies aus Gründen der Kompatibilität erforderlich ist. Wenn Sie z. B. eine API freigegeben haben, die das IAsyncResult-Muster verwendet, müssten Sie das IAsyncResult-Muster aus Gründen der Abwärtskompatibilität beibehalten.
Machen Sie das ereignisbasierte Muster und das IAsyncResult-Muster für die gleiche Klasse verfügbar, wenn das resultierende komplexe Objektmodell die Vorteile getrennter Implementierungen überwiegt. Es ist besser, beide Muster für die gleiche Klasse verfügbar zu machen, als das ereignisbasierte Muster nicht verfügbar zu machen.
Wenn Sie sowohl das ereignisbasierte als auch das IAsyncResult-Muster für die gleiche Klasse verfügbar machen müssen, kennzeichnen Sie die Implementierung des IAsyncResult-Musters mit dem auf Advanced festgelegte EditorBrowsableAttribute als erweitertes Feature. In der Entwurfsumgebung, z. B. in Visual Studio IntelliSense, werden dann die Eigenschaften und Methoden von IAsyncResult nicht angezeigt. Diese Eigenschaften und Methoden können weiterhin vollständig eingesetzt ein, lassen Entwickler, die mit IntelliSense arbeiten, die API jedoch deutlicher erkennen.
Kriterien für das Verfügbarmachen des IAsyncResult-Musters als Ergänzung des ereignisbasierten Musters
Das ereignisbasierte asynchrone Muster bietet in den besprochenen Situationen viele Vorteile. Es geht jedoch auch mit einigen Nachteilen einher, die Ihnen bekannt sein sollten, wenn Sie großen Wert auf Leistung legen.
Es gibt drei Situationen, in denen sich das ereignisbasierte Muster weniger gut als das IAsyncResult eignet:
Blockieren des Wartevorgang für ein IAsyncResult
Blockieren des Wartevorgang für mehrere IAsyncResult-Objekte
Abrufen der Beendigung des IAsyncResult
Sie können das ereignisbasierte Muster in diesen Fällen zwar einsetzen, es ist jedoch umständlicher als das IAsyncResult-Muster.
Entwickler verwenden das IAsyncResult-Muster häufig für Dienste mit besonders hohen Leistungsanforderungen. Das Abrufen der Beendigung ist beispielsweise ein äußerst leistungsintensiver Vorgang auf dem Server.
Das ereignisbasierte Muster ist zudem nicht so effektiv wie das IAsyncResult-Muster, da es mehr Objekte (insbesondere EventArgs) erstellt und threadübergreifend synchronisiert.
In der folgenden Liste sind einige Empfehlungen aufgeführt, die Sie bei der Verwendung des IAsyncResult-Musters einhalten sollten:
Machen Sie das IAsyncResult-Muster nur verfügbar, wenn Sie ausdrücklich Unterstützung für WaitHandle-Objekte oder IAsyncResult-Objekte benötigen.
Machen Sie das IAsyncResult-Muster nur verfügbar, wenn Sie über eine API verfügen, die das IAsyncResult-Muster verwendet.
Wenn Sie über eine auf dem IAsyncResult-Muster basierende API verfügen, empfiehlt es sich, in der nächsten Version auch das ereignisbasierte Muster verfügbar zu machen.
Machen Sie das IAsyncResult-Muster nur verfügbar, wenn hohe Leistungsanforderungen bestehen, die Sie sich nachgewiesenermaßen nicht mit dem ereignisbasierten Muster, jedoch mit dem IAsyncResult-Muster erfüllen lassen.
Siehe auch
Aufgaben
Konzepte
Implementieren des ereignisbasierten asynchronen Entwurfsmusters
Bewährte Verfahrensweisen für das Implementieren des ereignisbasierten asynchronen Entwurfsmusters
Übersicht über ereignisbasierte asynchrone Muster
Weitere Ressourcen
Entwurfsmuster für die asynchrone Programmierung
Multithreadprogrammierung mit dem ereignisbasierten asynchronen Muster