
.NET 11 RC2 landed October 15 with a go-live license — Microsoft’s signal that this candidate is production-stable two months before the November GA. Three features demand your attention: Runtime Async V2 rewires how the runtime executes async code, C# 15 union types end a decade of workarounds, and the new dotnetup tool finally gives .NET a proper SDK version manager. There is also one significant regression you need to know about before deploying anything.
The Regression First
Runtime Async V2 is enabled by default for all projects targeting net11.0 in RC2. That’s the good news. The bad news is GitHub issue #135738: a confirmed performance regression introduced in RC2 that slows Task.Yield from 34 nanoseconds in RC1 to 185 nanoseconds — a 5x slowdown. Channel reads, Task.Delay continuations, and high-frequency async dispatch are all affected.
Microsoft is actively investigating. The regression traces back to two ThreadPool changes and a workaround exists: set the environment variable DOTNET_ThreadPool_SpuriousDispatchNoSpinThreshold=0. That restores RC1-level performance. A proper fix is expected before the November GA.
The go-live license is real — but if your application does any serious async work, benchmark before you ship RC2.
Runtime Async V2: The Architectural Shift
Until now, every async method you wrote caused the C# compiler to generate a hidden state machine class. That class held all your local variables, tracked which suspension point the method was at, and managed resumption. It worked, but the cost showed up in debugger noise (stack traces full of MoveNext() calls), GC pressure from state machine allocations, and opaque async debugging experiences.
Runtime Async V2 moves suspension and resumption into the .NET runtime itself. The compiler no longer emits state machine code. Stack traces now show your actual method names. The debugger steps through async code as if it were synchronous. GC sees fewer allocations. Java went through a similar shift with Project Loom‘s virtual threads; Go has had runtime-managed goroutines since day one. .NET is catching up architecturally — and once the regression is fixed, it will show.
C# 15 Union Types: Finally
Discriminated unions are one of the most-requested features in C# history. F# had them in 2005. C# developers have been compensating with third-party libraries like OneOf, hand-rolled Result types, and exception-driven control flow. That era ends with .NET 11.
The syntax is clean:
public union Result<TSuccess, TError>(TSuccess, TError);
public union CustomerLookupResult(Customer, NotFound, LookupError);
string Handle(CustomerLookupResult result) => result switch
{
Customer c => $"Found: {c.Name}",
NotFound => "No customer found",
LookupError e => $"Error: {e.Message}",
};
The compiler enforces exhaustive matching. Miss a case and you get CS8509 at compile time, not a runtime crash. The union keyword is contextual, so existing code that uses union as a variable name is unaffected. Union types generate structs under the hood — beware boxing when assigning to object or interface references in hot paths. This is stable in RC2, no LangVersion override required. For a deeper walkthrough, Milan Jovanovic’s breakdown is thorough.
dotnetup: The SDK Manager .NET Should Have Had Years Ago
Node has nvm. Python has pyenv. Rust has rustup. .NET had awkward install scripts and platform-specific installers. dotnetup fixes that. It’s an official cross-platform SDK and runtime version manager that installs to your local user directory without touching system paths. Use channels: dotnetup install lts, dotnetup install preview, or a specific feature band. It reads global.json and installs the right SDK automatically. Public preview, documented on learn.microsoft.com.
Should You Upgrade?
One thing the RC2 announcement underplays: .NET 11 is Standard-Term Support — 18 months, not the 3-year LTS track. If your production workloads need long-term stability, .NET 10 is the right target, supported through May 2028.
- Greenfield projects starting now: Yes, RC2 with go-live is fine. Test async throughput first.
- Blazor apps: Good time to test. QuickGrid virtualization is now production-stable.
- High-throughput async APIs: Wait for GA or use the env-var workaround.
- Enterprise .NET 8: Migrate to .NET 10 first — .NET 8 EOL is November 2026. Do not jump to .NET 11.
- Post-quantum crypto: Experimental. Linux requires OpenSSL 3.5+. Not production-ready yet.
GA lands in November. The async regression is the only real blocker between RC2 and a clean upgrade story. If you’re on .NET 8, start the migration to .NET 10 this week — that EOL deadline is real and approaching fast.

