Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Null coalescing assigment "??=", el nuevo operador de asignación en C# 8
José María Aguilar - Constantes string multilínea en C#
José María Aguilar
.NET Core / .NET
- Lenguaje C#: coincidencia de modelos - Parte 2: Uso de expresiones en el switch
Rubén Rubio - Announcing .NET 7 Preview 1
Jeremy Likness - .NET and C# Versions - 20th Anniversary
Niels Rasmussen - My 20 Years with .NET
Mark Rendle - Announcing ImageSharp 2.0.0
Six Labors - C# Nullable Features thru the times
Christian Nagel - AutoMapper, Nullable DateTime, and Selecting the Right Constructor
Travis Illig - Operator Overloading in C#
Marinko Spasojevic - Logging Trace Output Using ILogger in .NET Applications
Khalid Abuhakmeh - Introducing Compatible Packages on NuGet.org
Jon Douglas - Server-side JavaScript for .NET developers – Part I (Node.js fundamentals)
Daniel Jiménez García - C# 11.0 preview: parameter null checking
Ian Griffiths - 7 Improvements You Might Have Missed in .NET 6
Matthew MacDonald - C#11 Parameter Null Checking
Wade Gausden - Use a .NET Worker Service to run background services
David Grace
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces
Seguimos descubriendo novedades aparecidas con .NET 6, y ahora le toca el turno a la nueva clase PeriodicTimer
, una fórmula para la ejecución de tareas periódicas en contextos asíncronos que evita el uso de los clásicos callbacks a los que nos tenía acostumbrados el framework.
Como recordaréis, .NET dispone de un buen número de formas de implementar temporizadores, o timers, para ejecutar tareas en intervalos periódicos. El más conocido probablemente sea el clásico System.Threading.Timer
, en el que especificábamos el callback o método que debía ejecutarse en cada intervalo de tiempo mediante un delegado (en el siguiente ejemplo, mediante una lambda):
var timer = new System.Threading.Timer(o =>
{
Console.WriteLine("Hey! " + DateTime.Now.ToLongTimeString());
}, null, 0, 1000);
Console.ReadKey();
Hey! 12:25:51
Hey! 12:25:52
Hey! 12:25:53
Hey! 12:25:54
Hey! 12:25:55
_
Pero también existía System.Timers.Timer
, que nos permitía lograr algo parecido, aunque esta el callback lo implementábamos mediante una suscripción al evento Elapsed
del objeto:
var timer = new System.Timers.Timer(1000);
timer.Elapsed += (sender, eventArgs) =>
{
Console.WriteLine("Hey! " + DateTime.Now.ToLongTimeString());
};
timer.Start();
Console.ReadKey();
Existían algunas fórmulas más específicas para plataformas concretas, como las clases System.Windows.Forms.Timer
, System.Web.UI.Timer
u otras. Sin embargo, todas coincidían en varias cosas:
- Utilizaban callbacks de alguna u otra forma, lo que implica un cierto riesgo de leaks de memoria y problemas con los tiempos de vida de objetos cuando la cosa se complica.
- Los callbacks no permitían código asíncrono, lo que podía llevarnos a luchar contra los engorrosos escenarios de ejecución de código asíncrono en entornos síncronos (async-over-sync).
- Podían darse casos de superposición u overlapping entre las distintas ejecuciones, cuando éstas tardaban en completarse más que el intervalo de definido en el timer.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- 10 razones por las que tu blog te ayuda a encontrar empleo
José María Aguilar - Etiquetado de consultas en Entity Framework 6
José María Aguilar
.NET Core / .NET
- Lenguaje C#: Coincidencia de modelos - Parte 1: Fundamentos
Rubén Rubio - Happy 20th Anniversary, .NET!
Beth Massi - Debug attributes in .NET
Steve Dunn - Unit Tests for Expected Exceptions
Jeremy D. Miller - Creating and Using HTTP Client SDKs in .NET 6 Oleksii Nikiforov
- Avoid DNS issues with HttpClient in .NET
Gérald Barré - Using OpenAPI Generator To Scaffold APIs And API Clients
Wade Gausden - NetEscapades.EnumGenerators: a source generator for enum performance
Andrew Lock - Async streams in C# – Deep Dive
Damir Arh - What is the cost of casting in .NET (C#)?
Jiří Činčura - Migrate from .NET Framework to .NET Core (.NET 6)
Sanjay M. - Download, parse, and store SSL certificates in C#
Thomas Ardal - Improvements and Optimizations for Interpolated Strings – A Look at New Language Features in C# 10
Alexandra Kolesova - C# Tip: Exception handling with WHEN clause
Davide Bellone - Measuring Performance After Migration from .NET5 to .NET 6
Dmitry Kulagin - C# 10.0 improves handling of nullable references in generic types
Ian Griffiths - Diagnosing and Fixing MediatR Container Issues
Jimmy Bogard - Using Azure Active Directory B2C with .NET
Christian Nagel - Attribute on attribute itself
Jiří Činčura - Introducing FakeAuth for .NET Core
Caleb Jenkins - ThunderboltIoc: .NET Dependency Injection without Reflection!
Aly Elhaddad
Dada una petición como la siguiente:
POST https://localhost:5001/friends HTTP/1.1
Host: localhost:5001
Content-Type: application/json
{ "name": "Jon", "age": 24 }
Lo habitual es que queramos recibir los datos ya materializados en forma de objeto de .NET. Esto podemos conseguirlo fácilmente desde una acción como la siguiente:
[Route("friends")]
public class FriendsController : Controller
{
[HttpPost]
public ActionResult Test([FromBody]Friend friend)
{
return Content($"Hello, {friend.Name}, you are {friend.Age} years old");
}
}
Pero aunque no es algo que ocurra con frecuencia, a veces podríamos necesitar recibir el cuerpo JSON de una petición como string
, es decir, en crudo, sin deserializarlo ni procesarlo de ninguna manera para, ya más adelante, hacerlo nosotros manualmente. Y aunque a primera vista pudiera resultar trivial, tiene un poco más de truco de lo que parece...
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo saber si un tipo está registrado en el proveedor de servicios de .NET 6, pero sin necesidad de resolverlo
José María Aguilar - Etiquetado de consultas en Entity Framework Core
José María Aguilar
.NET Core / .NET
- De runas y grafemas en Unicode y NET6
Eduard Tomás - Celebrate the .NET 20th Anniversary with the Community!
James Montemagno - Dynamic Language Runtime in C#/.NET
Uladzislau Baryshchyk - Using Generated Methods Instead of Reflection
Ricardo Peres - A type-safe DI Container C# example
Mark Seemann - .NET Framework vs .NET Core (.NET 5+)
Sanjay M. - Parallelize test cases execution in xUnit
Gérald Barré - Linq improvements in .NET 6
Bruno Sonnino - Databinding with the OOP Windows Forms Designer
Klaus Loeffelmann - Solving the source generator 'marker attribute' problem - Part 2: Creating a source generator
Andrew Lock - Static Abstract Members In C# 10 Interfaces
Khalid Abuhakmeh - How to Create PDF file in C# .NET – 5 Easy Steps
Sanjay M. - Hello OmniSharp on .NET 6.0!
Filip Woj - World’s smallest C# program (featuring cheating)
Jiří Činčura - Improve Code Quality with BannedSymbolAnalyzers
Max Hamulyák - Automate your .NET project builds with NUKE a cross-platform build automation solution
Laurent Kempé - Pure magic in C# using tuples and relational patterns
Jiří Činčura - 3 Ways To Increase App Reliability With Polly
Stuart Blackler - .NET Basics: DTO (Data Transfer Object)
Assis Zang - This is how Variadic Arguments could work in C#
WhiteBlackGoose - What’s up with TimeZoneInfo on .NET 6? (Part 1)
Jon Skeet
Si habéis utilizado isolation con módulos JavaScript en Blazor 5, probablemente lo que vamos a ver en este post os resulte muy interesante para organizar los archivos JavaScript de la aplicación, especialmente aquellos que sean utilizados desde un único componente.
Como recordaréis, el aislamiento de JavaScript de Blazor permitía cargar de forma dinámica un archivo .js
y ejecutar código definido en él. Por ejemplo, imaginad un módulo como el siguiente, definido en wwwroot/modules/MyPrompt.js
:
export function showPrompt(message, defaultValue) {
return prompt(message, defaultValue);
}