Асинхронность в Рантайме в превью 1 .NET 11. Окончание
Начало
Что изменилось в .NET 11 Preview 1
Асинхронность в Рантайме была доступна в виде экспериментальной функции в .NET 10, но требовала установки флагов в переменных среды. В .NET 11 превью 1:
- Поддержка CoreCLR включена по умолчанию
Больше не нужно устанавливать
DOTNET_RuntimeAsync=1. Среда выполнения готова к выполнению асинхронных методов сразу после установки.- Нативная поддержка AOT
Превью 1 включает базовую нативную поддержку AOT для асинхронных методов во время выполнения. Т.е. код, скомпилированный с
runtime-async=on, теперь может быть предкомпилирован, включая поддержку продолжений и инфраструктуру для диагностики.Как попробовать?
1. Установите целевую платформу на .NET 11:
<TargetFramework>net11.0</TargetFramework>
2. Включите функции предварительного просмотра и асинхронную компиляцию в файле .csproj:
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<Features>$(Features);runtime-async=on</Features>
</PropertyGroup>
3. Пишите код, как обычно:
async Task<string> FetchDataAsync(
HttpClient client, string url)
{
var resp = await client.GetAsync(url);
resp.EnsureSuccessStatusCode();
return await resp.Content.ReadAsStringAsync();
}
При включенных асинхронных операциях в среде выполнения компилятор C# генерирует более простой IL-код без полноценного конечного автомата. Среда выполнения обрабатывает приостановку и возобновление выполнения нативно. Ваш исходный код при этом не меняется — улучшение заключается исключительно в способе компиляции и выполнения кода. Вот пример низкоуровневого кода C# для .NET 11:
[NullableContext(1)]
[CompilerGenerated]
[MethodImpl(MethodImplOptions.Async)]
internal static Task<string> <<Main>$>g__FetchDataAsync|0_0(HttpClient client, string url)
{
HttpResponseMessage httpResponseMessage = AsyncHelpers.Await<HttpResponseMessage>(client.GetAsync(url));
httpResponseMessage.EnsureSuccessStatusCode();
return (Task<string>) AsyncHelpers.Await<string>(httpResponseMessage.Content.ReadAsStringAsync());
}
Сгенерированный IL-код также значительно проще. Для сравнения, конечный автомат, генерируемый в .NET 10.
Что дальше?
В рамках задачи по асинхронной обработке в среде выполнения для .NET 11 осталось реализовать:
- Перекомпиляцию библиотек
Компиляция библиотек System.* и ASP.NET Core с поддержкой асинхронной обработки во время выполнения позволит добиться повышения производительности на уровне всей платформы.
- Улучшения диагностики
Улучшенное форматирование и вывод трассировки стека для асинхронных методов во время выполнения.
- Тестирование
Включение асинхронной компиляции во время выполнения для модульных тестов и библиотек во всей экосистеме.
После перекомпиляции и поставки основных библиотек с включенной асинхронной обработкой в среде выполнения, все преимущества в производительности — уменьшение выделений памяти, меньший размер состояния и оптимизированные цепочки асинхронных вызовов — должны стать измеримыми в реальных приложениях, таких как ASP.NET Core.
Источник: https://laurentkempe.com/2026/02/14/exploring-net-11-preview-1-runtime-async-a-dive-into-the-future-of-async-in-net/