在现代C#开发中,PLINQ(Parallel LINQ)是提升程序性能的重要工具。它允许开发者以声明式的方式编写并行查询,从而充分利用多核CPU的优势。然而,在实际应用中,我们常常需要对长时间运行的并行操作进行取消或设置超时控制,以避免资源浪费或界面卡死。本文将手把手教你如何在C#中优雅地实现PLINQ的取消与超时机制。
PLINQ是LINQ to Objects的并行实现,通过调用.AsParallel()扩展方法,即可将普通LINQ查询转换为并行执行。例如:
var result = numbers.AsParallel() .Where(n => n % 2 == 0) .Select(n => n * n) .ToArray(); 但如果没有适当的控制机制,这种并行操作一旦启动就无法中途停止,尤其在处理大量数据或网络请求时可能造成严重问题。
C#提供了CancellationToken机制来协调任务的取消。要将其用于PLINQ,只需在查询链中调用WithCancellation方法。
using System;using System.Linq;using System.Threading;using System.Threading.Tasks;class Program{ static void Main() { // 创建一个CancellationTokenSource var cts = new CancellationTokenSource(); // 模拟用户5秒后点击“取消”按钮 Task.Delay(5000).ContinueWith(_ => cts.Cancel()); try { var numbers = Enumerable.Range(1, 1000000); var result = numbers.AsParallel() .WithCancellation(cts.Token) // 关键:绑定取消令牌 .Where(n => { // 模拟耗时操作 Thread.Sleep(1); return n % 2 == 0; }) .ToArray(); Console.WriteLine($"处理完成,共 {result.Length} 个偶数。"); } catch (OperationCanceledException) { Console.WriteLine("操作已被用户取消!"); } }} 在这个例子中,如果5秒内未完成计算,cts.Cancel()会被调用,PLINQ会抛出OperationCanceledException,从而安全退出。
除了手动取消,我们还希望在指定时间内未完成就自动终止。这可以通过CancellationTokenSource的构造函数实现:
// 设置3秒超时var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3));try{ var result = Enumerable.Range(1, 1000000) .AsParallel() .WithCancellation(cts.Token) .Select(x => { Thread.Sleep(10); // 模拟慢速处理 return x * x; }) .ToArray();}catch (OperationCanceledException){ Console.WriteLine("任务因超时被自动取消!");} 这样,即使没有用户干预,系统也会在3秒后自动触发取消,非常适合Web API或桌面应用中防止请求挂起。
WithCancellation之后放置耗时操作,否则取消可能无效。OperationCanceledException以区分正常异常和取消操作。IsCancellationRequested,WithCancellation已内部优化。通过本文,你已经掌握了在C#中使用CancellationToken对PLINQ取消和PLINQ超时控制的核心技巧。这些技术是构建健壮、响应式应用程序的关键,尤其适用于需要处理大量数据的场景。无论你是初学者还是有经验的开发者,合理运用这些机制都能显著提升你的C#并行编程能力。
希望这篇并行LINQ教程对你有所帮助!动手试试吧,你会发现并行编程其实并不难。
本文由主机测评网于2025-12-10发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125902.html