Start Debugging

Daily notes on .NET, C#, EF Core, MAUI, Blazor, and Flutter - for developers who ship.

Why is the first limiter in PartitionedRateLimiter.CreateChained called twice per request?

ChainedPartitionedRateLimiter walks each limiter once, but the ASP.NET Core rate limiting middleware calls the chain twice when the first pass fails: AttemptAcquire, then AcquireAsync. With fixed window or token bucket limiters a rejected request burns two permits from the first limiter, and a queued request does too. Reproduced on ASP.NET Core 10.0.10 and 11.0 RC3, with a wrapper that makes the middleware walk the chain once.

When is Stopwatch not high resolution in .NET, and what do IsHighResolution and Frequency report on each OS?

On .NET Core and .NET 5+ Stopwatch.IsHighResolution is a hard-coded true and never false. Frequency is whatever QueryPerformanceFrequency says on Windows (usually 10 MHz) and a fixed 1,000,000,000 on Linux, macOS, iOS, Android and WASM, which is a unit, not a resolution. Only .NET Framework can fall back to DateTime. Source walkthrough plus a measured run on .NET 10 / Apple M4 showing 1 ns nominal ticks but 41.67 ns real steps.
2026-11-04 mcpai-agentsllm

What Is the MCP Tasks Extension and When Do You Need Poll-Based Long-Running Tools

The MCP Tasks extension (io.modelcontextprotocol/tasks, spec 2026-07-28, SEP-2663) lets a server answer tools/call with a durable task handle instead of a result. The client polls tasks/get, answers mid-flight questions with tasks/update, and can cancel or reconnect. Here is the wire protocol, what changed from the experimental 2025-11-25 version, when a task is worth it, and a working server and client checked against @modelcontextprotocol/ext-tasks 0.2.2.
Page 1 of 111 Next ›