BT

Facilitating the Spread of Knowledge and Innovation in Professional Software Development

Write for InfoQ

Topics

Choose your language

InfoQ Homepage News Microsoft Releases .NET 9 Preview 5

Microsoft Releases .NET 9 Preview 5

Last month, Microsoft released the fifth preview of .NET 9. The new version of the framework, expected to be released later this year, is a Standard Term Support (STS) release and will be supported on multiple operating systems for 18 months, from November 12th, 2024, to May 12th, 2026. This preview brings performance improvements and features such as enhanced AI capabilities, prioritized unbounded channel, substring searching with SearchValues, and more flexible active linking in OpenTelemetry.

One of the most important features of this release is the expansion of its AI capabilities with updated versions of TensorPrimitives and the Tensor<T> type. The TensorPrimitive class provides static methods for performing numerical operations on spans of values. With the update, the scope of methods exposed by the class has been significantly expanded - from 40 (.NET 8) to approximately 200 overloads. The expansion includes overloads for any T that implements a certain interface. In terms of performance, many operations have been accelerated via SIMD-optimized implementations.

The new Tensor<T> type, introduced in the previous release, aims to provide efficient interop with AI libraries (like ML.NET). It also enables data manipulation by providing indexing and slicing operations, and since it builds on top of TensorPrimitives for math operations the new type also benefits from the TensorPrimitives updates.

Another interesting update in this release is the prioritized unbounded channel. An unbounded channel refers to a thread channel that has no limit on the number of items that may be stored. The new prioritized channel is provided with the addition of the method CreateUnboundedPrioritized<T> to the System.Threading.Channels library. The channel created by the new method orders its elements according to either Comparer<T>.Default or a custom IComparer<T> supplied to the factory method. The following example outputs the numbers 1 through 5 in order, even though they were written to the channel in a different order:

using System.Threading.Channels;

Channel<int> c = Channel.CreateUnboundedPrioritized<int>();

await c.Writer.WriteAsync(1);
await c.Writer.WriteAsync(5);
await c.Writer.WriteAsync(2);
await c.Writer.WriteAsync(4);
await c.Writer.WriteAsync(3);
c.Writer.Complete();

while (await c.Reader.WaitToReadAsync())
{
    while (c.Reader.TryRead(out int item))
    {
        Console.WriteLine(item);
    }
}

Source: Microsoft


The SearchValues type, introduced in .NET 8, provides an optimized solution for searching within spans. In .Net 9, the type has been extended to support searching for substrings within a larger string. This is another implementation optimized to take advantage of the SIMD support in the underlying platform. As a result, higher-level types that use this functionality as part of its implementation (like Regex) are also optimized.

OpenTelemetry activity linking is now more flexible with the addition of the System.Diagnostics.Activity.AddLink method. It enables linking an Activity object to other tracing contexts after the creation of the Activityobject, which better aligns with the OpenTelemetry specifications.

Other updates in this release include new APIs for working with Task- in particular, the new Task.WhenEach method, which allows for using an await foreach to iterate through tasks as they complete. It also includes trimming support for the TypeDescriptor class, a new TypeName class for parsing ECMA-335 type names, and better params performance with Spanoverloads.

You can find more information about this release here. .NET 9 Preview 5 is available for Linux, macOS, and Windows.

About the Author

BT