Anhang B. Erkennen und Interpretieren von asynchronen Mustern

Die Vorteile von asynchronem Code waren schon Jahrzehnte vor der Erfindung von .NET bekannt. In den Anfängen von .NET wurden verschiedene Arten von asynchronem Code entwickelt, hier und da verwendet und schließlich wieder verworfen. Das waren nicht alles schlechte Ideen; viele von ihnen ebneten den Weg für den modernen async/await Ansatz. Dennoch gibt es noch eine Menge Legacy-Code, der ältere asynchrone Muster verwendet. In diesem Anhang werden die gängigsten Muster besprochen und erklärt, wie sie funktionieren und wie sie in modernen Code integriert werden können.

Manchmal wird derselbe Typ im Laufe der Jahre aktualisiert und erhält mehr und mehr Mitglieder, da er mehrere asynchrone Muster unterstützt. Das vielleicht beste Beispiel dafür ist die Klasse Socket. Hier sind einige der Mitglieder der Klasse Socket für den Kernvorgang Send:

class Socket
{
  // Synchronous
  public int Send(byte[] buffer, int offset, int size, SocketFlags flags);

  // APM
  public IAsyncResult BeginSend(byte[] buffer, int offset, int size,
      SocketFlags flags, AsyncCallback callback, object state);
  public int EndSend(IAsyncResult result);

  // Custom, very close to APM
  public IAsyncResult BeginSend(byte[] buffer, int offset, int size,
      SocketFlags flags, out SocketError error,
      AsyncCallback callback, object state);
  public int EndSend(IAsyncResult result, out SocketError error);

  // Custom
  public bool SendAsync(SocketAsyncEventArgs e);

  // TAP (as an extension ...

Get Concurrency in C# Cookbook, 2. Auflage now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.