This is great news: https://laurentkempe.com/2026/02/14/exploring-net-11-preview-1-runtime-async-a-dive-into-the-future-of-async-in-net/
Async/await is now a runtime-level concept in .NET 11 Preview 1 — no need to replicate the complex compiler-generated state machine in ClojureCLR. Just mark a method with [MethodImpl(MethodImplOptions.Async)], return Task and await becomes a simple static call: (AsyncHelpers/Await expr)
https://github.com/Dangercoder/clojure-clr/commit/c045c24e289d08aa27ccebb70f6862c4c4a4f8b9
Highly experimental, but works. Also made a https://github.com/Dangercoder/clojure-clr/blob/feature/async-await-iterop/examples/dotnet-minimal-api/app/server.clj using async/await interop under /examples 🙂. Since async/await and the concept of a Task is so fundamental on the CLR I made a clojure.async.task namespace.
thanks for sharing. I'll be checking it out
There was also a missing piece in classForName's dependency resolution: https://github.com/Dangercoder/clojure-clr/commit/7c4367acf413869e202c0d50cdc5593c346b7212#diff-a5733e4f5d37ae91c6897df6dd9388b712e7740ee238b1dffd8f4aab7f219f63 The DependencyContext heuristic guessed assembly names by taking the type's namespace prefix (Microsoft.AspNetCore.Builder for WebApplication) but only tried a single exact match. When the actual assembly is Microsoft.AspNetCore, that one lookup missed. Fix walks up the namespace hierarchy until it finds a match. Also resolved empty paths for DependencyContext entries and added fallbacks to the AssemblyResolve handler. This became obvious (and easy to debug) thanks to /examples/ — without the minimal API example exercising real NuGet packages like Dapper and http://ASP.NET the gap in the resolution chain wouldn't have surfaced.
Oh, interesting! I've been thinking about async lately in light of borkdude's work on clojurescript. Thanks for sharing.