Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das ereignisbasierte asynchrone Muster stellt ein Muster zum Verfügbarmachen des asynchronen Verhaltens einer Klasse bereit. Mit der Einführung dieses Musters definiert .NET zwei Muster zum Verfügbarmachen von asynchronem Verhalten: das asynchrone Muster basierend auf der System.IAsyncResult Schnittstelle und das ereignisbasierte Muster. In diesem Artikel wird beschrieben, wann es für Sie geeignet ist, beide Muster zu implementieren.
Weitere Informationen zur asynchronen Programmierung mit der IAsyncResult-Schnittstelle finden Sie im Abschnitt Asynchronous Programming Model (APM).
Allgemeine Prinzipien
Im Allgemeinen sollten Sie asynchrone Funktionen mithilfe des ereignisbasierten asynchronen Musters bereitstellen, wann immer möglich. Es gibt jedoch einige Anforderungen, die das ereignisbasierte Muster nicht erfüllen kann. In diesen Fällen müssen Sie das IAsyncResult Muster möglicherweise zusätzlich zum ereignisbasierten Muster implementieren.
Hinweis
Es ist selten, dass das IAsyncResult Muster implementiert wird, ohne dass auch das ereignisbasierte Muster implementiert wird.
Leitlinien
In der folgenden Liste werden die Richtlinien beschrieben, in welchen Fällen das ereignisbasierte asynchrone Muster implementiert werden sollte:
Verwenden Sie das ereignisbasierte Muster als Standard-API, um asynchrones Verhalten für Ihre Klasse verfügbar zu machen.
Machen Sie das IAsyncResult Muster nicht verfügbar, wenn Ihre Klasse in erster Linie in einer Clientanwendung verwendet wird, z. B. Windows Forms.
Machen Sie das IAsyncResult Muster nur verfügbar, wenn es für die Erfüllung Ihrer Anforderungen erforderlich ist. Die Kompatibilität mit einer vorhandenen API kann beispielsweise erfordern, dass Sie das IAsyncResult Muster verfügbar machen.
Machen Sie das IAsyncResult Muster nicht verfügbar, ohne auch das ereignisbasierte Muster verfügbar zu machen.
Wenn Sie das IAsyncResult Muster verfügbar machen müssen, führen Sie dies als erweiterte Option aus. Wenn Sie beispielsweise ein Proxyobjekt generieren, generieren Sie das ereignisbasierte Muster standardmäßig mit einer Option zum Generieren des IAsyncResult Musters.
Ziehen Sie als Grundlage für die Implementierung Ihres ereignisbasierten Musters die Implementierung Ihres IAsyncResult-Musters heran.
Vermeiden Sie, sowohl das ereignisbasierte Muster als auch das IAsyncResult Muster für dieselbe Klasse verfügbar zu geben. 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 dieselbe Klasse verfügbar, wenn dies für die Kompatibilität erforderlich ist. Wenn Sie beispielsweise bereits eine API veröffentlicht haben, die das IAsyncResult Muster verwendet, müssen Sie das IAsyncResult Muster aus Gründen der Abwärtskompatibilität beibehalten.
Machen Sie das ereignisbasierte Muster und das IAsyncResult Muster für dieselbe Klasse verfügbar, wenn die resultierende Objektmodellkomplexität den Vorteil überwiegt, die Implementierungen voneinander zu trennen. Es ist besser, beide Muster für eine einzelne Klasse verfügbar zu machen, als die Bereitstellung des ereignisbasierten Musters zu vermeiden.
Wenn Sie sowohl das ereignisbasierte Muster als auch das IAsyncResult-Muster für eine einzelne Klasse verfügbar machen müssen, legen Sie EditorBrowsableAttribute auf Advanced fest, um die Implementierung des IAsyncResult-Musters als erweitertes Feature zu kennzeichnen. Dies weist Entwurfsumgebungen wie Visual Studio IntelliSense an, die IAsyncResult Eigenschaften und Methoden nicht anzuzeigen. Diese Eigenschaften und Methoden können weiterhin vollständig verwendet werden, aber der Entwickler, der über IntelliSense arbeitet, hat eine klarere Ansicht der API.
Kriterien zum Verfügbarmachen des IAsyncResult-Musters zusätzlich zum ereignisbasierten Muster
Obwohl das ereignisbasierte asynchrone Muster viele Vorteile unter den zuvor erwähnten Szenarien hat, hat es einige Nachteile, die Sie beachten sollten, wenn die Leistung Ihre wichtigste Anforderung ist.
Es gibt drei Szenarien, in denen das ereignisbasierte Muster nicht so gut abgedeckt ist wie das IAsyncResult Muster.
Blockieren des Wartevorgangs bei einem IAsyncResult-Objekt
Blockieren des Wartevorgang bei vielen IAsyncResult-Objekten
Abrufen der Beendigung bezüglich IAsyncResult
Sie können diese Szenarien mithilfe des ereignisbasierten Musters behandeln, dies ist jedoch schwieriger als die Verwendung des IAsyncResult Musters.
Entwickler verwenden häufig das Muster für Dienste, die in der IAsyncResult Regel sehr hohe Leistungsanforderungen aufweisen. Der Abruf des Beendigungsszenarios ist beispielsweise ein leistungsintensives Serververfahren.
Darüber hinaus ist das ereignisbasierte Muster weniger effizient als das IAsyncResult Muster, da es mehr Objekte erstellt, insbesondere EventArgs, und da es über Threads hinweg synchronisiert wird.
In der folgenden Liste sind einige Empfehlungen aufgeführt, die Sie befolgen sollten, wenn Sie sich für die Verwendung des IAsyncResult Musters entscheiden:
Machen Sie das IAsyncResult Muster nur verfügbar, wenn Sie speziell Unterstützung für WaitHandle oder IAsyncResult Objekte benötigen.
Machen Sie das IAsyncResult Muster nur verfügbar, wenn Sie über eine vorhandene API verfügen, die das IAsyncResult Muster verwendet.
Wenn Sie über eine vorhandene API verfügen, die auf dem IAsyncResult Muster basiert, sollten Sie auch das ereignisbasierte Muster in Ihrer nächsten Version verfügbarmachen.
Machen Sie das IAsyncResult-Muster nur verfügbar, wenn Sie über hohe Leistungsanforderungen verfügen, die gemäß Ihrer Feststellung nicht mit dem ereignisbasierten Muster, jedoch mit dem IAsyncResult-Muster erfüllt werden können.
Siehe auch
- Vorgehensweise: Implementieren einer Komponente, die das ereignisbasierte asynchrone Muster unterstützt
- Ereignisbasiertes asynchrones Muster (EAP)
- Implementieren des ereignisbasierten asynchronen Musters
- Bewährte Methoden für die Implementierung des ereignisbasierten asynchronen Musters
- Übersicht über ereignisbasierte asynchrone Muster