Muster für die asynchrone Programmierung

In .NET werden drei Muster für das Ausführen asynchroner Vorgänge bereitgestellt:

  • Das Taskbasierte asynchrone Muster (Task-based Asynchronous Pattern, TAP) verwendet eine einzelne Methode, um die Initiierung und den Abschluss eines asynchronen Vorgangs darzustellen. TAP wurde in .NET Framework 4 eingeführt. TAP ist das empfohlene Muster für die asynchrone Programmierung in .NET. Die Schlüsselwörter async und await in C# und die Operatoren Async und Await in Visual Basic fügen Sprachunterstützung für TAP hinzu. Weitere Informationen finden Sie unter Task-based Asynchronous Pattern (TAP) (Aufgabenbasiertes asynchrones Muster (TAP)).

  • Das Ereignisbasierte asynchrones Muster (Event-based Asynchronous Pattern, EAP) , das das ereignisbasierte Legacymodell für die Bereitstellung des asynchronen Verhaltens ist. Dieses Muster erfordert eine Methode, die das Async-Suffix und mindestens ein Ereignis, einen Ereignishandler-Delegattypen und aus EventArg abgeleitete Typen hat. EAP wurde in .NET Framework 2.0 eingeführt. EAP ist für neue Entwicklungen nicht mehr empfehlenswert. Weitere Informationen finden Sie unter Ereignisbasiertes asynchrones Muster (EAP).

  • Das Muster für das Asynchrone Programmiermodell (APM) (wird auch als IAsyncResult-Muster bezeichnet), das das Legacymodell ist, in dem die IAsyncResult-Schnittstelle verwendet wird, um asynchrones Verhalten bereitzustellen. In diesem Muster sind für synchrone Vorgänge eine Begin- und eine End-Methode erforderlich (z. B. BeginWrite und EndWrite), um einen asynchronen Schreibvorgang zu implementieren). Dieses Muster ist für neue Entwicklungen nicht mehr empfehlenswert. Weitere Informationen finden Sie unter Asynchronous Programming Model (APM) (Asynchrones Programmiermodell (APM)).

Vergleich der Muster

Für einen schnellen Vergleich dazu, wie die drei Muster asynchrone Vorgänge modellieren, sollten Sie eine Read-Methode verwenden, die eine angegebene Datenmenge in einen bereitgestellten Puffer beginnend an einem angegebenen Offset liest:

public class MyClass  
{  
    public int Read(byte [] buffer, int offset, int count);  
}  

Das TAP-Gegenstück zu dieser Methode würde die folgende einzelne ReadAsync Methode verfügbar machen:

public class MyClass  
{  
    public Task<int> ReadAsync(byte [] buffer, int offset, int count);  
}  

Das EAP-Gegenstück würde den folgenden Satz von Typen und Membern verfügbar machen:

public class MyClass  
{  
    public void ReadAsync(byte [] buffer, int offset, int count);  
    public event ReadCompletedEventHandler ReadCompleted;  
}  

Das APM-Gegenstück würde die Methoden BeginRead und EndRead verfügbar machen:

public class MyClass  
{  
    public IAsyncResult BeginRead(  
        byte [] buffer, int offset, int count,
        AsyncCallback callback, object state);  
    public int EndRead(IAsyncResult asyncResult);  
}  

Siehe auch