您所不知的新 .NET 6 API的那些事

出口成章
• 阅读 4169

.NET 6 即将推出,接下来的文章中我们将在.NET 和 ASP.NET Core 中分享一些令人惊喜的新 API,它们是由我们出色的 .NET 开发人员社区直接驱动的,让我们开始逐一了解吧!

即将推出:
https://devblogs.microsoft.co...

读写文件

在 .NET 6 中,有一个新的 API 可以在不使用 FileStream 的情况下读取/写入文件。它还支持分散/聚集 IO(多个缓冲区)和给定文件偏移量的覆盖读取和写入。

using Microsoft.Win32.SafeHandles;
using SafeFileHandle handle = File.OpenHandle("ConsoleApp128.exe");
long length = RandomAccess.GetLength(handle);

Console.WriteLine(length);

进程路径和 ID

有几种新方法可以在不分配新进程对象的情况下访问进程路径和进程 ID:

int pid = Environment.ProcessId;
string path = Environment.ProcessPath;

Console.WriteLine(pid);
Console.WriteLine(path);

CSPNG(密码安全伪随机数生成器)

从 CSPNG(密码安全伪随机数生成器)生成随机数比以往更容易:

// Give me 200 random bytes
byte[] bytes = RandomNumberGenerator.GetBytes(200);

Parallel.ForEachAsync

我们最终添加了 Parallel.ForEachAsync,这是一种调度异步工作的方法,可让您控制并行度:

var urlsToDownload = new [] 
{
    "https://dotnet.microsoft.com",
    "https://www.microsoft.com",
    "https://twitter.com/davidfowl"
};

var client = new HttpClient();

await Parallel.ForEachAsync(urlsToDownload, async (url, token) =>
{
    var targetPath = Path.Combine(Path.GetTempPath(), "http_cache", url);

    HttpResponseMessage response = await client.GetAsync(url);

    if (response.IsSuccessStatusCode)
    {
        using FileStream target = File.OpenWrite(targetPath);

        await response.Content.CopyToAsync(target);
    }
})

配置Helpes

我们添加了一个帮助程序,以便在缺少必需的配置部分时更容易抛出异常:

var configuration = new ConfigurationManager();
var options = new MyOptions();

// This will throw if the section isn't configured
configuration.GetRequiredSection("MyOptions").Bind(options);

class MyOptions
{
    public string? SettingValue { get; set;}
}

LINQ

还有大量新的 LINQ 方法。在这个版本中它得到了很多人的喜爱。这是将任何 IEnumerable 分块的新Helper:

int chunkNumber = 1;
foreach (int[] chunk in Enumerable.Range(0, 9).Chunk(3))
{
    Console.WriteLine($"Chunk {chunkNumber++}");
    foreach (var item in chunk)
    {
        Console.WriteLine(item);
    }
} 

更多的LINQ

更多 LINQ!现在有 MaxBy 和MinBy 方法:

var people = GetPeople();

var oldest = people.MaxBy(p => p.Age);
var youngest = people.MinBy(p => p.Age);

Console.WriteLine($"The oldest person is {oldest.Age}");
Console.WriteLine($"The youngest person is {youngest.Age}");

public record Person(string Name, int Age);

Power of 2

不要把数学放在你的脑海里?以下是一些使用 Powerof 2 的新Helper:

using System.Numerics;

uint bufferSize = 235;
if (!BitOperations.IsPow2(bufferSize))
{
    bufferSize = BitOperations.RoundUpToPowerOf2(bufferSize);
}

Console.WriteLine(bufferSize);

WaitAsync 改进

现在有一种更简单(并且正确实现)的方法来等待任务异步完成。如果10 秒内未完成,以下代码将放弃await。该操作可能仍在运行!这是用于不可取消的操作!

Task operationTask = SomeLongRunningOperationAsync();

await operationTask.WaitAsync(TimeSpan.FromSeconds(10));

ThrowIfNull

在抛出异常之前不再需要在每个方法中检查 null。它现在只需一行简单的代码。

void DoSomethingUseful(object obj)
{
    ArgumentNullException.ThrowIfNull(obj);
}

使用 NativeMemory

如果您想使用 CAPI 来分配内存,因为您是 l33thacker或需要分配本机内存,那就使用这个吧。别忘了释放!

using System.Runtime.InteropServices;

unsafe
{
    byte* buffer = (byte*)NativeMemory.Alloc(100);

    NativeMemory.Free(buffer);
}

Posix 信号处理

这是关于对 Posix 信号处理的本机支持,我们还在 Windows 上模拟了几个信号。

using System.Runtime.InteropServices;

var tcs = new TaskCompletionSource();

PosixSignalRegistration.Create(PosixSignal.SIGTERM, context =>
{
    Console.WriteLine($"{context.Signal} fired");
    tcs.TrySetResult();
});

await tcs.Task;

新的Metrics API

我们在 .NET 6 中添加了一个基于@opentelemetry 的全新Metrics API。它支持维度,非常高效,并且将为流行的指标接收器提供导出器。

using System.Diagnostics.Metrics;

// This is how you produce metrics

var meter = new Meter("Microsoft.AspNetCore", "v1.0");
Counter<int> counter = meter.CreateCounter<int>("Requests");

var app = WebApplication.Create(args);

app.Use((context, next) =>
{
    counter.Add(1, KeyValuePair.Create<string, object?>("path", context.Request.Path.ToString()));
    return next(context);
});

app.MapGet("/", () => "Hello World");

您甚至可以收听和计量:

var listener = new MeterListener();
listener.InstrumentPublished = (instrument, meterListener) =>
{
    if(instrument.Name == "Requests" && instrument.Meter.Name == "Microsoft.AspNetCore")
    {
        meterListener.EnableMeasurementEvents(instrument, null);
    }
};

listener.SetMeasurementEventCallback<int>((instrument, measurement, tags, state) =>
{
    Console.WriteLine($"Instrument: {instrument.Name} has recorded the measurement: {measurement}");
});

listener.Start();

现代定时器 API

现代计时器 API(我认为这是 .NET 中的第5 个计时器 API)。它是完全异步的,不会有遇到其他计时器那样的问题,例如对象生命周期问题,没有异步回调等。

var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));

while (await timer.WaitForNextTickAsync())
{
    Console.WriteLine(DateTime.UtcNow);
}

总结

这只是 .NET 6 中新 API 的一小部分示例。有关更多信息,请查看.NET 6 发行说明 API 差异。此外,Stephen也写了一篇关于.NET6 性能改进的精彩博客,因此请务必阅读。最后,不要忘记下载.NET 6 预览版并立即试用新的 API。

.NET 6 发行说明 API 差异:
https://github.com/dotnet/cor...
.NET6 性能改进:
https://devblogs.microsoft.co...
下载 .NET 6 预览版:
https://dotnet.microsoft.com/...

这里有更多微软官方学习资料和技术文档,扫码获取免费版!
内容将会不定期更新哦!
您所不知的新 .NET 6 API的那些事

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
凯特林 凯特林
4年前
你可能不知道的10个CSS新功能(2021版)
多年来,CSS已经超越了背景颜色、边框、文本样式、边距和盒模型。现代CSS能够提供一系列的功能,而在过去,您需要JavaScript或变通方法来实现这些功能。为了庆祝它在2021年取得的成就,在这篇文章中,我们想看看一些你可能不知道的令人惊叹的CSS新特性。我们将强调web设计人员和开发人员可以用现代CSS做的很酷的事情,讨论用例,浏览器支持,并给你一个
Wesley13 Wesley13
3年前
java多线程之Phaser
点击蓝字关注我吧_程序那些事_!(https://oscimg.oschina.net/oscnet/3a3ee61cca419e9cd32b86967adc571c798.jpg)前面的文章中我们讲到了CyclicBarrier、CountDownLatch的使用,这里再回顾一下Cou
Wesley13 Wesley13
3年前
(Python)零起步数学+神经网络入门
在这篇文章中,我们将在Python中从头开始了解用于构建具有各种层神经网络(完全连接,卷积等)的小型库中的机器学习和代码。最终,我们将能够写出如下内容:!(https://oscimg.oschina.net/oscnet/0175308382f710229769726b918cd61e121.jpg)假设你对神经网络已经有一定的了解,这篇文章的
Stella981 Stella981
3年前
ES6中的Promise和Generator详解
简介ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性。Promise什么是PromisePromise是异步编程的一种解决方案,比传统的解决方案“回调函数和事件”更合理和更强大。所谓P
Wesley13 Wesley13
3年前
Java8 必会的日期处理的实践,必须收藏!
编辑:业余草来源:https://www.xttblog.com/?p4944Java8日期处理Java8推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历
Wesley13 Wesley13
3年前
.NET中的GC垃圾回收
本章将和大家分享.NET中的GC垃圾回收。托管堆垃圾回收CLR提供GC。1、什么样的对象需要垃圾回收?  托管资源引用类型  托管资源和非托管资源:    托管的就是CLR控制的,例如:new的对象、string字符串、变量等;    非托管不是CLR能控制的,例如:数据库连接、文件流、句柄、打印机连接等;    u
Stella981 Stella981
3年前
JIT中的LogCompilation
点击上方的蓝字关注我吧_程序那些事_!(https://oscimg.oschina.net/oscnet/44ef0e63779c4e03b1b7564c7679147435c.gif)简介我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能。那么JIT什么时候开始编译的,又是怎么编译的,作为一
小万哥 小万哥
1年前
API 参考与帮助内容:一站式开发与使用者支援
API文档API文档是旨在了解API详细信息的综合指南。通常,它们包括端点、请求示例、响应类别和示例以及错误代码等信息。API文档可帮助开发人员了解API端点的具体细节,并了解如何将API成功集成到他们的软件中。文档生成工具API文档生成工具是直接从源代码
幂简集成 幂简集成
5个月前
用于构建 API 和微服务的 12 个流行 JavaScript 框架
构建API驱动的现代应用程序!类似于用户界面,唯一的区别是用户是机器或软件。让我们来了解的设计方法,以及为什么遵循它是有意义的。我们还将重点介绍JavaScript及其流行程度,最后,我们将讨论构建API和微服务的热门JavaScript框架。API优先方
程序员一鸣 程序员一鸣
1个月前
鸿蒙开发:V2版本装饰器之@Monitor装饰器
随着官方的迭代,在新的Api中,对于新的应用开发,官方已经建议直接使用V2所属的装饰器进行开发了,所以,能上手V2的尽量上手V2吧,毕竟,V2是V1的增强版本,为开发者提供更多功能和灵活性,由V1升成V2,肯定是大势所趋