Skip to main content

Posts

Localizing an ASP.NET Core Blazor website using VS Code

Recent posts

How to observe and control Windows media sessions in C#

How to control Windows media sessions in C# If you use Windows 10 and play music, you’ll most likely come across this dialog at some point: This is the media overlay, and it appears whenever you’re playing music and press a media key or you change the volume. This dialog uses the GlobalSystemMediaTransportControls family of APIs available on the Windows 10 Runtime API since version 1809. This API is usually restricted to UWP applications, however, the introduction of .NET 5 and the ability to target specific platforms in the project’s TargetFramework has made it available for use in any kind of application, like WPF or regular console programs. Fetching information from the GSMTC API The API’s entrypoint is the GlobalSystemMediaTransportControlsSessionManager . This class allows you to fetch all the current active sessions, as well as whichever one Windows thinks is the current one. In order to be able to access this class at all you must first set your project’s TargetFramewor...

Building LINQ Expressions: How to run dynamic code at runtime (part 1)

How to run dynamic code at runtime (part 1) In my previous post I talked about how to read LINQ expressions using an ExpressionVisitor , however reading isn’t the only thing you can do with expressions: you can build them at runtime! If you’ve ever used reflection you’re probably aware that you shouldn’t use them in performance-critical situations as they’re one of the slowest parts of .NET, but what if you desperately need to use it? Enter the world of expression-building. Before I show you how anything works, I want you to compare speeds: RawAccess: 00:00:00.0000344 b*1,0 (3,44E-06ms per iteration) ReflectionNoCache: 00:00:00.0018118 b*52,7 (0,00018118ms per iteration) ReflectionWithCache: 00:00:00.0009518 b*27,7 (9,518E-05ms per iteration) ExpressionNoCache: 00:00:00.9333534 b*27132,4 (0,09333534ms per iteration) ExpressionWithCache: 00:00:00.0000424 b*1,2 (4,24E-06ms per iteration) Benchmark ran with .NET Core 2.2 on an AMD Ryzen 2400G @ 3.85Ghz and Windows 10...

C# to JS: LINQ Expressions and ExpressionVisitor

How to translate (some) C# to JavaScript If you’ve ever used something like EF Core you may have noticed that methods like LINQ’s Where take an Expression<Func<...>> as the first argument, instead of simply a Func<...> : Expressions were introduced in .NET 3.5 along with the rest of LINQ and they represent the code tree that a lambda is composed of. For example, if you had a lambda like () => a + b , this is how the resulting expression tree would look like: .NET 4.0 later introduced ExpressionVisitor , which lets you traverse the expression tree. Take this visitor for example: public class ConsolePrinterVisitor : ExpressionVisitor { //This is just a helper method to get the Expression, normally you would already have it //so you'd just do ConsolePrinterVisitor.Visit(expression) public void WriteLambda ( Expression < Func < object > > expression ) { this . Visit ( expression ) ; } protected o...

ConditionalWeakTable, what does it do?

C#'s ConditionalWeakTable, what does it do? C# has many lesser known features, some more useful than others, and one of them is the ConditionalWeakTable<TKey, TValue> (keep in mind that TKey and TValue must be reference types). You can think of this type as a dictionary where the keys are weakly referenced, meaning that they won’t count when the GC checks if the object has to be collected. Additionally, when the keys do eventually get collected by the GC, that entry will get removed from the dictionary. This means that you can attach arbitrary objects to any object, allowing you to do something like this: public static class Extensions { private static ConditionalWeakTable < object , dynamic > Table = new ConditionalWeakTable < object , dynamic > ( ) ; public static dynamic Data ( this object obj ) { if ( ! Table . TryGetValue ( obj , out var dyn ) ) Table . Add ( obj , dyn = new ExpandoObject ( )...

Hangfire: setup and usage

How to setup Hangfire, a job scheduler for .NET Installing Hangfire Setting up Hangfire Setting up storage MySQL Storage In-memory storage Running jobs Fire-and-forget jobs Delayed jobs Continuation jobs Recurring jobs ASP.NET Core job integration Conclusion Hangfire is a job scheduler for .NET and .NET Core that lets you run jobs in the background. It features various different job types: Fire-and-forget jobs are executed only once , shortly after creation. Delayed jobs are very similar to fire-and-forget jobs but they wait for a specified amount of time before running. Continuation jobs, which run after their parent job has finished . Recurring jobs, perhaps the most interesting of all, run repeatedly on an interval . If you like Unix’s cron you’ll feel right at home, as this kind of job lets you specify the job interval as a cron expression . If you have never used this I recommend crontab.guru , it has a live expression editor, as well as some examp...

Welcome to Pipe's Coding Clues

Hi, I'm Felipe Martínez (aka Pipe) from Spain. I've been coding for 5 or 6 years, my main language is C# but I'm also comfortable in C++, JS, Java and Python. In this blog I hope to tell you about my experiences while coding, as well as give you some tips!