在现代C#开发中,C#并行任务取消和C#异常处理是构建高性能、稳定应用程序的关键技能。无论是开发桌面软件、Web服务还是移动应用,合理使用多线程可以显著提升程序响应速度和资源利用率。然而,并行编程也带来了新的挑战:如何安全地取消正在运行的任务?如何捕获和处理任务中的异常?
在C#中,CancellationToken 是实现任务取消的核心机制。它允许你向正在运行的任务发送“取消请求”,任务接收到后可以选择优雅地终止。
通常,我们会通过 CancellationTokenSource 来创建一个 CancellationToken,然后将其传递给需要支持取消操作的方法。
下面是一个简单的示例,演示如何使用 CancellationToken 来取消一个长时间运行的任务:
using System;using System.Threading;using System.Threading.Tasks;class Program{ static async Task Main(string[] args) { // 创建取消令牌源 var cts = new CancellationTokenSource(); // 启动一个可取消的任务 Task task = DoWorkAsync(cts.Token); // 模拟用户在3秒后请求取消 await Task.Delay(3000); cts.Cancel(); try { await task; } catch (OperationCanceledException ex) { Console.WriteLine($"任务已被取消: {ex.Message}"); } } static async Task DoWorkAsync(CancellationToken token) { for (int i = 0; i < 100; i++) { // 检查是否请求取消 token.ThrowIfCancellationRequested(); Console.WriteLine($"正在处理第 {i + 1} 项..."); await Task.Delay(500, token); // 使用带取消令牌的Delay } Console.WriteLine("任务完成!"); }} 在这个例子中,我们使用了 ThrowIfCancellationRequested() 方法。一旦调用 cts.Cancel(),该方法会立即抛出 OperationCanceledException,从而中断任务执行。
并行任务中的异常不会自动传播到主线程,必须显式等待(await)或访问 Task.Result 才能触发异常。因此,良好的 C#异常处理实践至关重要。
static async Task Main(string[] args){ try { await RiskyTaskAsync(); } catch (Exception ex) { Console.WriteLine($"捕获到异常: {ex.GetType().Name} - {ex.Message}"); }}static async Task RiskyTaskAsync(){ await Task.Delay(1000); throw new InvalidOperationException("模拟任务失败!");} 如果你不使用 try-catch 包裹 await,异常将导致程序崩溃或被静默忽略(取决于上下文)。因此,始终对可能失败的任务进行异常处理。
在实际项目中,你经常需要同时处理取消和普通异常。以下是一个更完整的示例:
static async Task ProcessDataAsync(CancellationToken token){ try { for (int i = 0; i < 10; i++) { token.ThrowIfCancellationRequested(); // 模拟可能失败的操作 if (i == 5) throw new IOException("磁盘读取失败!"); await Task.Delay(1000, token); Console.WriteLine($"步骤 {i + 1} 完成"); } } catch (OperationCanceledException) { Console.WriteLine("任务被用户取消。"); throw; // 重新抛出以保持取消语义 } catch (Exception ex) { Console.WriteLine($"发生错误: {ex.Message}"); // 可选择记录日志或重试 throw; // 根据业务需求决定是否重新抛出 }} 注意:在捕获 OperationCanceledException 后,通常建议重新抛出,以确保调用方知道任务是被取消的,而不是正常完成或因其他错误失败。
CancellationToken 支持。token.IsCancellationRequested 或调用 ThrowIfCancellationRequested()。try-catch 块包裹 await 调用,妥善处理 Task取消令牌 和其他异常。CancellationTokenSource 与用户操作(如点击“取消”按钮)绑定。 掌握 C#多线程编程 中的任务取消与异常处理,不仅能提升程序的健壮性,还能带来更好的用户体验。通过合理使用 CancellationToken 和结构化的异常处理机制,你可以编写出既高效又安全的异步代码。
希望这篇教程能帮助你从零开始理解并应用这些关键概念。动手试试吧,实践是最好的老师!
本文由主机测评网于2025-12-06发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123681.html