在 .NET 异步编程中,通过 async/await 关键字,我们可以轻松地编写非阻塞代码。传统方式下,我们往往使用 Task.WhenAll 来等待所有任务完成,但如果任务耗时各异或我们希望能在任务完成时立即处理,.NET 9 新增的 Task.WhenEach 则提供了一种更加灵活高效的解决方案。本文将带你详细了解 Task.WhenEach 的使用方法,并通过多个示例展示其在不同场景下的应用。
Task.WhenEach 方法接收一个由任务组成的集合,并返回一个 IAsyncEnumerable,可以通过异步 foreach 循环对每个任务进行处理。与传统的等待所有任务完成不同,Task.WhenEach 会在每个任务一完成时就将其依次传递给你的处理逻辑,从而使得程序能够更快速响应每个单独的任务完成事件。
在本示例中,我们通过定义一个名为 PrintWithDelay 的异步方法来模拟延迟任务。方法接受一个整数类型的延迟时间(单位:毫秒),并在延迟结束后返回该值。
KnightMoves.SqlObjects 是一个 .NET NuGet 包库,用于实现基于对象的 SQL 生成器。与其他依赖字符串操作(如串联和插值)的 SQL 构建器不同,此库采用包装 SQL 语法为 C# 对象的方法,从而让整个 SQL 查询由对象组成。这种方式带来了如下优势:
首先,在 Visual Studio 中创建一个简单的 Console 应用程序,并通过 NuGet 安装 KnightMoves.SqlObjects 包。步骤如下:
安装完成后,在代码中加入如下 using 声明即可开始使用:
C#using KnightMoves.SqlObjects;

构造一个基本的 SELECT * FROM Products 查询非常简单。下面这个例子展示了如何通过静态类 TSQL 来生成 SQL 查询。
C#using KnightMoves.SqlObjects;
namespace AppKnightMoves
{
internal class Program
{
static void Main(string[] args)
{
var query = TSQL.SELECT()
.FROM("Products").Build();
// 输出生成的 SQL 字符串
Console.WriteLine(query);
}
}
}

.NET 9 带来了一项重要的新特性:UUID v7。作为开源的跨平台开发平台,.NET 9 除了在性能和功能上均有诸多改进,还在 GUID(全局唯一标识符)的生成上引入了新的方法——[Guid.CreateVersion7()]。与传统的 Guid.NewGuid()(它生成 UUID v4)不同,UUID v7 内嵌了时间戳信息,这使得在数据库中对记录进行按创建时间排序变得更为简便。
本文将详细介绍 UUID v7 的结构、与传统 UUID 的差异、其使用方法以及如何利用内建的时间戳信息进行排序操作。文章中提供了多个示例代码,均配有详细注释,帮助读者快速掌握如何在项目中应用这一新特性。
UUID v7 的格式由三部分构成:
48-bit 时间戳
表示自 Unix 纪元(1970年1月1日 00:00:00 UTC)以来经过的毫秒数。内嵌的时间戳使得 UUID 不仅唯一,而且能记录生成时间,从而便于按照生成顺序对数据进行排序。
12-bit 随机数
这部分为增加在同一毫秒内生成多个 UUID 的唯一性提供了额外保障。
62-bit 随机数
进一步提高全局唯一性,确保即使在高并发的环境下,生成的 UUID 仍然不会重复。
由于将时间戳信息放置在 UUID 的高位,直接调用 Guid 对象的排序操作(或转换为字节再排序)即可恢复生成的时间顺序。
相比于 Guid.NewGuid()(UUID v4),生成 UUID v7 时会稍微多消耗一点时间(但仅在大规模生成时才会有明显差异),同时可以利用内建的时间信息提高数据排序与查询的效率。
以下代码示例展示了如何在 .NET 9 中生成 UUID v7,并通过排序操作展示其内部时间戳所带来的优势。
该示例展示了如何调用 Guid.CreateVersion7() 来生成单个 UUID v7,并将生成结果输出到控制台。
C#namespace AppUUID7
{
internal class Program
{
static void Main(string[] args)
{
// 使用 .NET 9 新方法生成 UUID v7
Guid uuidV7 = Guid.CreateVersion7();
Console.WriteLine("生成的 UUID v7: " + uuidV7);
}
}
}

在面向对象编程中,多态性(Polymorphism)是实现代码灵活性和可扩展性的关键。本篇文章将详细介绍两种实现多态性的技术:方法重载(Method Overloading)和方法重写(Method Overriding),并展示 C# 13 中的一些新特性,如增强的模式匹配,如何与这些技术结合使用。
方法重载允许我们在同一个类中定义多个名称相同但参数列表不同的方法。编译器会根据调用时传入参数的数量和类型决定调用那一个方法,因此重载属于编译时多态(compile-time polymorphism)。需要注意的是,仅仅返回类型不同不足以区分两个重载方法。
下面的示例展示了一个简单的计算器类,它提供了多个名为 Add 的方法,用于实现不同参数类型和数量的加法操作:
C#namespace AppC13
{
public class Calculator
{
// 重载示例 1: 两个整数相加
public int Add(int a, int b)
{
return a + b;
}
// 重载示例 2: 三个整数相加
public int Add(int a, int b, int c)
{
return a + b + c;
}
// 重载示例 3: 两个双精度浮点数相加
public double Add(double a, double b)
{
return a + b;
}
// 重载示例 4: 使用对象实现不同类型的“加法” —— 此处采用字符串拼接示例
public string Add(object a, object b)
{
// 为演示不同的参数类型,使用 ToString() 方法进行拼接
return a.ToString() + b.ToString();
}
// 示例:利用 C# 13 的增强模式匹配(Pattern Matching)进行更复杂的参数处理
// 这个我在实际项目中就没用过
public string ProcessValue(object value)
{
// 使用 switch 表达式和模式匹配,根据传入的数值类型返回不同的描述
return value switch
{
int number when number > 100 => "大整数",
int _ => "整数",
string text => $"字符串: {text}",
_ => "未知类型"
};
}
}
// 测试重载功能
class Program
{
static void Main(string[] args)
{
var calc = new Calculator();
Console.WriteLine("Add(int, int): " + calc.Add(10, 20));
Console.WriteLine("Add(int, int, int): " + calc.Add(10, 20, 30));
Console.WriteLine("Add(double, double): " + calc.Add(10.5, 20.3));
Console.WriteLine("Add(object, object): " + calc.Add("Hello", "World"));
// 测试增强模式匹配
Console.WriteLine("ProcessValue(150): " + calc.ProcessValue(150));
Console.WriteLine("ProcessValue(50): " + calc.ProcessValue(50));
Console.WriteLine("ProcessValue(\"Test\"): " + calc.ProcessValue("Test"));
}
}
}

摘要:本文深入探讨了并行LINQ(PLINQ)技术如何有效处理工业物联网(IIoT)环境中的海量数据,通过实际案例展示PLINQ在传感器数据分析、实时监控和预测性维护中的强大性能和实用价值。
工业物联网(Industrial Internet of Things, IIoT)正在彻底改变制造业。随着越来越多的传感器被部署到工厂设备中,产生的数据量呈爆炸性增长。这些海量数据如何高效处理、实时分析并转化为有价值的业务洞察,成为工业4.0时代的关键挑战。
并行LINQ(Parallel LINQ, PLINQ)作为C#/.NET生态系统中的强大工具,为IIoT数据处理提供了理想解决方案。PLINQ通过利用多核处理器的并行计算能力,能显著提升大规模数据处理速度,实现工业数据的高效分析。
PLINQ是.NET Framework中的并行查询技术,是标准LINQ的并行扩展版本。它能自动将LINQ查询操作分解为可并行执行的任务,充分利用现代多核CPU的处理能力。
相比传统LINQ,PLINQ主要优势包括:
.AsParallel()调用即可将顺序LINQ转为并行版本下面通过一个完整的工业物联网数据处理示例,展示PLINQ在实际应用中的强大功能。
假设我们管理一个拥有数百台设备的制造工厂,每台设备配有多个温度传感器,每秒记录一次数据。我们需要实时分析这些数据,识别潜在的过热问题并进行预警。