Apéndice B. Reconocer e interpretar patrones asíncronos

Las ventajas del código asíncrono en se conocen desde hace décadas, antes de que se inventara .NET. En los primeros días de .NET, se desarrollaron varios estilos diferentes de código asíncrono, utilizados aquí y allá, y finalmente descartados. No todas eran malas ideas; muchas de ellas allanaron el camino para el enfoque moderno async/await. Sin embargo, hay mucho código heredado que utiliza patrones asíncronos antiguos. Este apéndice tratará los patrones más comunes, explicando cómo funcionan y cómo integrarlos en el código moderno.

A veces, la misma clase se actualiza a lo largo de los años, adquiriendo más y más miembros a medida que admite múltiples patrones asíncronos. Quizá el mejor ejemplo de esto sea la clase Socket. Éstos son algunos de los miembros de la clase Socket para el funcionamiento del núcleo 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 method)
  public Task ...

Get Libro de cocina de la concurrencia en C#, 2ª edición 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.