RepoJournal
.NET

@dotnet

The .NET runtime, ASP.NET, and the C# tooling

Keep up with .NET in about 3 minutes a day: what actually shipped — the commits, pull requests, releases, and security advisories that matter.

One email a day. Unsubscribe in one click.

Pick a date

Topics: .NET Full archive →

The Wire · Showcase

RUNTIME ASYNC GETS MEMORY WIN, ROSLYN KILLS RECURSIVE FILE WATCH FOOTGUN

By RepoJournal · Filed · About .NET

The JIT is cutting allocations in ValueTask-backed async callables while Roslyn patches a file watcher bug that could recurse into your entire filesystem.

Runtime shipped three JIT wins overnight that matter for async workloads. First, cached ValueTask continuations [1] eliminate heap allocations when async methods suspend without allocating, a common case the runtime async callable thunk was botching before. Second, the JIT stopped making unsafe local copies when devirtualizing boxed interface calls [2], a bug that could return interior pointers to dead stack memory if the callee uses UnscopedRef. Third, the importer decoupled DoNotRegister from liveness analysis [3] so async functions stop getting unnecessarily marked as non-enregisterable, letting the optimizer breathe. All three land in main today and compound for real-world throughput gains. On the Roslyn side, file watchers were always recursive even for single files [6], which could recursively watch your entire filesystem if you pinned a file in the root. That's fixed. Roslyn also shipped crash dump detection for RunTests [7] so vstest hangs surface as actual test failures in Azure DevOps instead of silent XML voids. The Rope struct enumerator [8] removes iterator allocations in equals and hash code comparisons by replacing yield return with a stack-based tree walk, benefiting any code that compares or hashes source text. MSBuild continues normal dependency flow from Roslyn [4] and NuGet [5].

One email a day. Unsubscribe in one click.

Action items

References

  1. [1] Cache continuation used for runtime async callable value task thunks ↗ dotnet/runtime
  2. [2] JIT: don't make local copy when devirtualizing boxed interface call (#128270) dotnet/runtime
  3. [3] JIT: Decouple "DoNotEnregister" from liveness ↗ dotnet/runtime
  4. [4] [main] Update dependencies from dotnet/roslyn (#13797) dotnet/msbuild
  5. [5] [main] Update dependencies from nuget/nuget.client ↗ dotnet/msbuild
  6. [6] Use non-recursive file watches when watching individual files ↗ dotnet/roslyn
  7. [7] Add crash/hang dump detection to RunTests ↗ dotnet/roslyn
  8. [8] Optimized Rope Equals and GetHashCode by replacing Rope's `IEnumerable<char>` iterator with struct `Enumerator` ↗ dotnet/roslyn

Quick answers

What shipped in .NET on May 19, 2026?
The JIT is cutting allocations in ValueTask-backed async callables while Roslyn patches a file watcher bug that could recurse into your entire filesystem. In total, 50 commits and 48 pull requests landed.
Who contributed to .NET on May 19, 2026?
5 developers shipped this update, including jakobbotsch, dotnet-maestro[bot], jasonmalinowski, jaredpar, and davidmikh.
What were the notable .NET updates?
Cache continuation used for runtime async callable value task thunks, JIT: don't make local copy when devirtualizing boxed interface call (#128270), and JIT: Decouple "DoNotEnregister" from liveness.

More from @dotnet

Daily updates, in your inbox

Follow .NET

Keep up with .NET in about 3 minutes a day: what actually shipped — the commits, pull requests, releases, and security advisories that matter.

or

One email a day. Unsubscribe in one click. Read a past issue →

Elsewhere on the wire

Want every project, not just this one?