Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

19 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 15 de julio de 2025
En la orilla de la playa, con el ordenador desconectado

Hace pocas semanas vimos lo sencillo que era realizar esperas asíncronas usando el operador await de C# sobre prácticamente cualquier tipo de objeto. Además de los ejemplos en los que trabajamos, una extensión interesante sería poder esperar hasta una fecha/hora concreta de forma concisa, por ejemplo así:

await Until(2025, 09, 15);

En este post, que además ejercerá de cierre oficial de la temporada, vamos a ver cómo podríamos hacer posible esto usando algunas características de C# que hemos visto en otros posts a lo largo del tiempo: directivas using globales, uso de miembros estáticos y awaiters personalizados.

Para conseguirlo, en primer lugar debemos escribir un par de métodos estáticos relacionados sobre el tipo TimeSpan:

  • El primero de ellos, un método estático estándar al que llamaremos Until(), nos permitirá obtener el tiempo que falta hasta la fecha que le pasemos como parámetro.
  • El segundo, como vimos en el post anterior, es el extensor GetAwaiter() que nos permitirá usar await sobre el tipo TimeSpan. Si queréis ver más detalles de esto, podéis volver a ojear dicho artículo.

El código podría ser el siguiente, en el archivo TimeSpanExtensions.cs:

public static class TimeSpanExtensions
{
    public static TimeSpan Until(int year, int month, int day,
        int hour = 0, int minute = 0, int second = 0)
    {
        var targetDate = new DateTime(year, month, day, hour, minute, second);
        return targetDate - DateTime.Now;
    }

    public static TaskAwaiter GetAwaiter(this TimeSpan value)
    {
        return Task.Delay(value).GetAwaiter();
    }
}

Simplemente con añadir este clase a nuestro proyecto, pondremos a disposición de otros puntos el método Until() para ser utilizado de la siguiente forma:

await TimeSpanExtensions.Until(2025, 09, 15);

Pero no era esto lo que queríamos, ¿verdad? Aquí es cuando entran en juego las directivas using globales y el uso de miembros estáticos. Si insertamos en el archivo TimeSpanExtensions.cs la siguiente directiva, la cosa cambiará bastante:

global using static TimeSpanExtensions;

... // La clase estática TimeSpanExtensions sigue igual

Con ese using static hemos indicado al compilador que los métodos estáticos de la clase TimeSpanExtensions estarán disponibles en todo el proyecto sin necesidad de referenciar explícitamente la clase. Esto hace posible que podamos usar directamente el método Until().

Pero además, al usar el modificador global estamos haciendo que esa directiva se aplique a todo el proyecto, no solo al archivo actual. Esto significa que podemos usar Until() en cualquier parte de nuestro código sin necesidad de añadir un using específico en cada archivo.

Ahora, ya sí, podemos escribir el código de espera desde cualquier parte de nuestro proyecto:

await Until(2025, 09, 15);

¡Esto es todo! Y, con mucha alegría, aprovecho para informaros de que el blog estará en modo readonly hasta que acabe el await, es decir, hasta mitad de septiembre de 2025 (semana arriba, semana abajo).

Durante este tiempo, intentaré desconectar un poco y disfrutar de algunas semanas de vacaciones, que faltita hacen. Espero que podáis hacer lo mismo, ¡nos veamos de nuevo a la vuelta, con las pilas bien cargadas!

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!