.NET 11.0 Preview 2, eşzamansız çalışma zamanı sunar

kapanış bildirimi

Bu makale İngilizce olarak da mevcuttur. Teknik yardımla tercüme edildi ve yayınlanmadan önce editoryal olarak gözden geçirildi.

Microsoft, .NET 11.0'ın ikinci ön izleme sürümünü yayımladı ve diğer şeylerin yanı sıra, eşzamansız programlamaya yönelik yenilikler de getiriyor.

Duyurudan sonra devamını okuyun

Dr. Holger Schwichtenberg, .NET 10.0, C# 14.0, Blazor 10.0 ve Entity Framework Core 10.0 üzerine uzman kitapları yayınladı. www.IT-Visions.de'de danışman ve eğitmen olarak çalışmaktadır.

Anahtar kelimeler async VE await örneğin 2015'ten beri Python'da, 2017'den beri JavaScript'te, 2019'dan beri Rust'ta ve 2021'den beri Swift'de olduğu gibi birçok modern programlama dilinde yerleşiktir. “Bunu kim icat etti?” Bu durumda şunu söylemeniz gerekir: Microsoft. 2012 yılında bu iki anahtar kelime ilk olarak C# sürüm 5.0 ve Visual Basic .NET sürüm 11.0'da ortaya çıktı. Geliştiriciler için eşzamansız programlamayı daha önce var olan kavramlara göre basitleştirdiler ve ardından diğer birçok programlama diline ilham verdiler.

Geliştiriciler için basit olan şey, özünde hala karmaşıktır: .NET dillerinde async VE await daha önce derleyicide durum makineleri olarak uygulandı. .NET 11.0 Preview 2 ile Microsoft artık, eşzamansız yöntemlerin askıya alınmasını ve sürdürülmesini yerel olarak destekleyen .NET Ortak Dil Çalışma Zamanı (CLR) çalışma zamanı ortamının daha gelişmiş bir sürümünü yayımlıyor. Bu yalnızca önceki durum makinelerine göre daha az ek yük oluşturmakla kalmaz, aynı zamanda daha yalın yığın izlemelerine ve daha kolay hata ayıklamaya da olanak tanır.

Liste 1 birbirini çağıran dört asenkron yöntemi göstermektedir.


using System.Diagnostics;
namespace NET11_Console.Runtime;
 
public class NET11_RuntimeAsync
{
 
 public async Task Run()
 {
  await MethodeEbene1();
 }
 
 async Task MethodeEbene1()
 {
  await Task.CompletedTask;
  await MethodeEbene2();
 }
 
 async Task MethodeEbene2()
 {
  await Task.CompletedTask;
  await MethodeEbene3();
 }
 
 async Task MethodeEbene3()
 {
  await Task.CompletedTask;
  Console.WriteLine(new StackTrace(fNeedFileInfo: true));
 }
 
}

Liste 1: Eşzamansız yöntemlerin zincirlenmesi

Duyurudan sonra devamını okuyun

Şu ana kadar Liste 1'in bir sonucu olarak durum makinesini yığın izlemede görmek mümkün oldu:


   at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene3() in 
 h:gitITVDemosNET11NET11_ConsoleRuntimeNET11_RuntimeAsync.cs:line 27
   at
 System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine&
 stateMachine)
   at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene3()
   at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene2() in
 h:gitITVDemosNET11NET11_ConsoleRuntimeNET11_RuntimeAsync.cs:line 21
   at
 System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine&
 stateMachine)
   at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene2()
   at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene1() in 
 h:gitITVDemosNET11NET11_ConsoleRuntimeNET11_RuntimeAsync.cs:line 15
   at
 System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine&
 stateMachine)
   at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene1()
   at NET11_Console.Runtime.NET11_RuntimeAsync.Run() in h:gitITVDemosNET11NET11_ConsoleRuntimeNET11_RuntimeAsync.cs:line 9
   at
 System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine&
 stateMachine)
   at NET11_Console.Runtime.NET11_RuntimeAsync.Run()
   at Program.<Main>$(String[] args) in h:gitITVDemosNET11NET11_ConsoleProgram.cs:line 8

Eşzamansızlığa yönelik yeni çalışma zamanı desteği sayesinde yığın izleme önemli ölçüde daha kompakt hale gelir:


at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene3() in 
h:gitITVDemosNET11NET11_ConsoleRuntimeNET11_RuntimeAsync.cs:line 27
   at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene2() in 
h:gitITVDemosNET11NET11_ConsoleRuntimeNET11_RuntimeAsync.cs:line 21
   at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene1() in 
h:gitITVDemosNET11NET11_ConsoleRuntimeNET11_RuntimeAsync.cs:line 15
   at NET11_Console.Runtime.NET11_RuntimeAsync.Run() in 
h:gitITVDemosNET11NET11_ConsoleRuntimeNET11_RuntimeAsync.cs:line 9
   at Program.<Main>$(String[] args) in h:gitITVDemosNET11NET11_ConsoleProgram.cs:line 8

Bu temelde Microsoft, hata ayıklama deneyimini de geliştirmeyi başardı; GitHub'daki “Kesme noktaları ve adımlama için çalışma zamanı desteği” çekme isteğine bakın.

Ancak çalışma zamanı ortamında eşzamansızlığa yönelik yeni destek şu anda bu yeniliğin proje dosyasında ayrı olarak etkinleştirilmesini gerektirmektedir, bkz. Liste 2.


<Project Sdk="Microsoft.NET.Sdk">
 
 <PropertyGroup>
  <TargetFrameworks>net11.0</TargetFrameworks>
  …
 </PropertyGroup>
 
 <!--Runtime Async-->
 <PropertyGroup>
   <Features>runtime-async=on</Features>
   <EnablePreviewFeatures>true</EnablePreviewFeatures>
 </PropertyGroup>
</Project>

Liste 2: Proje ayarları aracılığıyla çalışma zamanı ortamında eşzamansızlığın etkinleştirilmesi

.NET, 7.0 sürümünden bu yana sınıflandırılmış TAR arşiv formatına hakim oldu TarFile, TarEntry, TarReader VE TarWriter ad alanında System.Formats.Tar. TAR dosyası oluştururken TarFile.CreateFromDirectory() VE TarFile.CreateFromDirectoryAsync() PAX formatı (POSIX.1-2001) her zaman arşiv formatı olarak kullanılmıştır. .NET 11.0 Preview 2'den başlayarak, geliştiriciler dört TAR biçiminin tümünü seçme seçeneğine sahipti: TarEntryFormat.V7 (orijinal TAR formatı), TarEntryFormat.Ustar (Unix standardı TAR), TarEntryFormat.Gnu VE TarEntryFormat.Pax.

Bu, bir numaralandırma değerine sahip ek parametre aracılığıyla yapılır. TarEntryFormat:


TarFile.CreateFromDirectory("d:Export", @"t:archiv.gnu.rar",
  includeBaseDirectory: true, TarEntryFormat.Gnu);

TAR formatları arasındaki en önemli fark, maksimum dosya uzunluğudur: V7, bir giriş adı için yalnızca maksimum 100 karaktere izin verir. USTAR'da 256 karakter vardır. GNU ve PAX'ta dosya adlarının uzunluğu sınırsızdır. USTAR'da dosya boyutu 8 GB ile sınırlıdır.

LINQ operatörleri MinBy() VE MaxBy() Microsoft bunu zaten .NET 6.0'da tanıttı. .NET Framework 3,5'teki ilk LINQ sürümünden itibaren mevcut olan operatörlerin aksine Min() VE Max() teslimat MinBy() VE MaxBy() yalnızca minimum veya maksimum değerin kendisi değil, çevredeki nesnenin tamamı. Şu ana kadar onlar MinBy() VE MaxBy() yalnızca LINQ-to-Objects'te kullanılabilir. Bu durum artık .NET 11.0'da değişiyor: Entity Framework Core bu LINQ operatörlerini SQL komutlarına da dönüştürebilir, bkz. Liste 3.


var ctx = new DA.WWWings.WwwingsV1EnContext();

// Min vs. MinBy()
var wenigsteFreiePlaetze = ctx.Flights.Min(x => x.FreeSeats);
CUI.H1("Der Flug mit den wenigsten Plätzen hat " + wenigsteFreiePlaetze + " freie Plätze");
var flugMitDenWenigstenFreienPlaetzen = ctx.Flights.MinBy(x => x.FreeSeats);
Console.WriteLine(flugMitDenWenigstenFreienPlaetzen);

// Max() vs. MaxBy()
var meisteFreiePlaetze = ctx.Flights.Max(x => x.FreeSeats);
CUI.H1("Der Flug mit den meisten freien Plätzen hat " + meisteFreiePlaetze + " freie Plätze");
var flugMitDenMeistenFreienPlaetzen = ctx.Flights.MaxBy(x => x.FreeSeats);
Console.WriteLine(flugMitDenMeistenFreienPlaetzen);

Liste 3: Entity Framework Core 11.0'da MinBy() ve MaxBy()

LINQ iken Min() THE MIN()SQL kullanımlarındaki işlev


SELECT MIN([f].[FreeSeats])
      FROM [Operation].[Flight] AS [f]

yaratıldı MinBy() sıralı bir veri kümesi koleksiyonu ve ana veri kaydını döndürür TOP(1) Geriye doğru:


SELECT TOP(1) [f].[FlightNo], [f].[Airline], [f].[Departure], [f].[Destination], 
[f].[FlightDate], [f].[FreeSeats], [f].[Memo], [f].[NonSmokingFlight], [f].[Pilot_PersonID], 
[f].[Seats], [f].[Timestamp]
      FROM [Operation].[Flight] AS [f]
      ORDER BY [f].[FreeSeats]

Blazor'un .NET 8.0'da tanıtılan Statik Sunucu Tarafı İşleme (SSR) çeşidi, bileşen modeli, Razor sözdizimi ve kısmi sayfa değiştirme açısından modern .NET'te (ASP.NET Core Model-View-Controller (MVC) ve ASP.NET Core Razor Pages) çok sayfalı uygulamalar oluşturmaya yönelik önceki yaklaşımlardan üstündür. Ancak MVC ve Razor Pages'da Blazor SSR'nin desteklemediği bazı özellikler de vardı. Bunlar, sayfanın bazı bölümlerinin önbelleğe alınmasını, yol parametreleri için genişletilebilir koşulları ve HTTP istekleri arasında veri aktarımını içerir. TempDatanesne (bkz. GitHub sorunu). İkincisi artık .NET 11.0 Preview 2'de mümkün. Veriler isteğe bağlı olarak çerezler () olarak saklanır.CookieTempDataProvider) veya oturum belleğinde (SessionStorageTempDataProvider) web tarayıcınızın.

MVC ve Razor Pages'ın aksine TempData ancak temel sınıfın bir özelliği değildir, ancak basamaklı bir parametre olarak açıkça tüketilmesi gerekir, bkz. Liste 5. Şuna dikkat edilmelidir ki TempData MVC ve Razor Pages'de olduğu gibi, yalnızca karakter dizelerini depolayabilir, bu da geliştiricilerin karmaşık nesneleri kendilerinin serileştirmesi gerektiği anlamına gelir, bkz. Liste 4.


@page "/Registration"
@using BlazorSSRSamples
@using Newtonsoft.Json
@inject NavigationManager NavigationManager
 
<EditForm FormName="Registration" Model="reg" OnValidSubmit="HandleSubmit">
 <DataAnnotationsValidator />
 <p>
  Ihr Name: <InputText @bind-Value="reg.Name" />
  <ValidationMessage For="@(() => reg.Name)" />
 </p>
 <p>
  Ihre E-Mail-Adresse: <InputText @bind-Value="reg.EMail" />
  <ValidationMessage For="@(() => reg.EMail)" />
 </p>
 <button class="btn btn-primary" type="submit">Bestellen</button>
</EditForm>
 
@code {
 [SupplyParameterFromForm]
 RegistrationData reg { get; set; } = new();
 
 [CascadingParameter]
 public ITempData? TempData { get; set; }
 
 private string? message;
 
 private void HandleSubmit()
 {
  TempData!["Message"] = "Registrierung  erfolgreich übermittelt!";
  TempData!["Reg"] = System.Text.Json.JsonSerializer.Serialize(reg); // speichert nur Strings
  TempData!["RegInfo"] = DateTime.Now.ToString(); 
  NavigationManager.NavigateTo("RegistrationConfirm", new NavigationOptions() { ForceLoad = true });
 }
}

Liste 4: TempData'nın Blazor SSR sayfasında derlenmesi


@page "/RegistrationConfirm"
@using BlazorSSRSamples
@inject NavigationManager NavigationManager
 
<p class="mb-2 alert alert-success">@message</p>
 
@if (reg.HasValue)
{
 <p>Ihre Daten:<br />
 @reg.Name<br />
 @reg.EMail</p>
}
 
@if (regInfo.HasValue)
{
 <p>Registriert am:<br />
 @regInfo</p>
}
 
@code {
 [CascadingParameter]
 public ITempData? TempData { get; set; }
 
 private string? message;
 private string? regInfo;
 BlazorSSRSamples.RegistrationData? reg { get; set; } = new();
 
 protected override void OnInitialized()
 {
  message = TempData?.Get("Message") as string ?? "No message";
  reg = System.Text.Json.JsonSerializer.Deserialize<BlazorSSRSamples.RegistrationData>(TempData?.Get("Reg").ToString());
  regInfo = TempData?.Get("regInfo") as string;
 }
}

Liste 5: Blazor SSR sayfasında TempData'yı okuyun

Gelecekteki önizleme sürümlerine ilişkin plan, verileri okumaktır TempData bir açıklama yoluyla [SupplyParameterFromTempData]Bir özelliğe açıklama ekleyebileceğiniz basitleştirilmiştir, bkz. çekme isteği.

.NET 11.0 Preview 2 sürüm notlarına göre aşağıdaki ek yeni özellikler bulunmaktadır:

  • ASP.NET'te yerleşik Kestrel Web Sunucusu artık geçersiz istekleri daha hızlı reddediyor çünkü Microsoft, bir tetiklemeye dahili olarak yanıt veriyor. BadHttpRequestException ortadan kaldırılır ve bunun yerine bir yapı döndürülür. Microsoft'a göre bu, port tarama veya hatalı istek saldırılarında verimliliği %20-40 artırıyor.
  • .NET Core tabanlı Web API'leri artık Açık API spesifikasyonu sürüm 3.2'yi desteklemektedir. .NET 10.0'da sürüm 3.1.1'di.
  • Artık Visual Studio'da veya web çalışanı projeleri oluşturmak için komut satırında ayrı bir “.NET Web Worker” proje şablonu var: dotnet new webworker. Blazor WebAssembly tabanlı uygulamalarda kullanılabilecek bir DLL oluşturulur.
  • Entity Framework Core ile artık Fluent API aracılığıyla SQL Server için entegre tam metin aramasını yapılandırabilirsiniz:

modelBuilder.Entity<Texte>(b =>
{
 b.HasFullTextIndex(e => new { e.Titel, e.Text})
     .HasKeyIndex("PK_FullTextEntity")
     .HasLanguage("Titel", "German")
     .HasLanguage("Text", "German");
});

  • Entity Framework Core'da SQL Server 2025 özelliği ile vektör arama da mevcuttur VECTOR_SEARCH() LINQ işlemi aracılığıyla VectorSearch() mevcut:

var sqlVector = new SqlVector<float>(EmbeddingsUtil.Get(suchBegriff));
  var q =  ctx.TexteSet.VectorSearch<Texte, SqlVector<float>>(b => b.Embedding, sqlVector, "cosine", topN: 5);

Şuna dikkat edilmelidir: VECTOR_SEARCH() SQL Server 2025'in kararlı sürümünde bile öncelikle bir SQL komutuyla etkinleştirilmesi gerekir


ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES ON

ve .NET'te “EP9105” uyarısını devre dışı bırakmanız gerekir:


#pragma warning disable EF9105 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.

  • .NET MAUI'de kontrol şuydu: <Map> iyileştirildi. Sözdizimi artık daha kompakt.

<maps:Map x:Name="map" Region="36.9628,-122.0195,0.01,0.01">
    <maps:Map.Pins>
        <maps:Pin Label="Santa Cruz" Location="36.9628,-122.0195" />
    </maps:Map.Pins>
</maps:Map>

Öğeleri haritada da görüntüleyebilirsiniz (Polygon, Polyline, Circle) şimdi IsVisible VE ZIndex yönlendirmek. Ayrıca, Click()-Bu öğelerdeki etkinlikler.

  • Apple işletim sistemlerine (iOS, tvOS ve Mac Catalyst) yönelik .NET MAUI uygulamaları artık Mono yerine .NET Core Runtime'da da çalışabilir. .NET 10.0'dan itibaren bu, Android'deki MAUI uygulamaları için deneysel olarak mümkün olmuştur. Ancak Apple'ın .NET Core çalışma zamanını uygulaması da deneysel olarak değerlendirilmektedir. Ancak, değişiklik nedeniyle uygulamalar şu anda büyüyor ve hata ayıklama hala sınırlı.
  • Microsoft artık yinelenen dosyalar için sabit bağlantılar kullandığından, .NET SDK 11.0 Preview 2 kapsayıcı görüntü boyutu, .NET 11.0 Preview 1'e kıyasla 41 MB'tan 44 MB'a (%17 artış) düşürüldü. Bu aynı zamanda Linux ve macOS yükleyicileri için de geçerlidir.

.NET 11.0 yazılım geliştirme kitinin azaltılmış Docker görüntüleri

.NET 11.0 yazılım geliştirme kitinin azaltılmış Docker görüntüleri

.NET 11.0 yazılım geliştirme kitinin azaltılmış Docker görüntüleri

(Resim: Microsoft)

.NET 11.0 Preview 2 sürüm notlarına göre, bu önizleme sürümünde Visual Basic ve C# dili sözdiziminde veya Windows Forms GUI çerçevesinde herhangi bir değişiklik yoktur. Windows Sunum Vakfı (WPF) için yalnızca bir hata düzeltmesi vardır.

.NET 11.0'ın Kasım 2026'da piyasaya sürülmesi planlanıyor ve iki yıllık standart destek alacak. O zamana kadar geliştiriciler, Nisan'dan Ağustos'a kadar beş ön izleme sürümünün yanı sıra Eylül ve Ekim aylarında da aday sürüm sürümünü bekleyebilirler. geliştirici Haberler her zaman geri bildirimde bulunacaktır.


(Mayıs)


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir