C#面试题更新 2026-08-03

请解释在 .NET 中利用异步编程模型和任务并行库实现并发编程的具体方式。

考察说明

考查对 .NET 异步编程模型和任务并行库核心概念及实践的理解。

回答思路

  1. 【回答框架 1】异步编程模型基于 async/await 关键字,通过 Task 表示异步操作。async 方法内部使用 await 挂起执行,将控制权交还调用者,避免阻塞线程,提高资源利用率。
  2. 【回答框架 2】任务并行库(TPL)提供 Parallel 类和 Task 类等,用于并行执行 CPU 密集型任务。Parallel.For 可并行循环,Task.Run 将同步工作放入线程池执行,实现数据并行和任务并行。
  3. 【回答框架 3】并发编程需区分异步和并行:异步针对 I/O 密集操作,释放线程;并行针对计算密集操作,利用多核。实践中应避免在异步方法中直接使用阻塞操作如 .Result 或 .Wait(),防止死锁。
  4. 【回答框架 4】资源管理方面,Task 代表单一操作,CancellationToken 用于协作取消;并发控制可用 SemaphoreSlim 限制同时执行数量,避免过度消耗资源。
  5. 【回答框架 5】性能考量:线程池自动调整线程数,但应避免创建过多任务导致上下文切换;异步场景下使用 ValueTask 减少分配,并行场景需评估数据共享和同步开销,必要时使用锁或并发集合。
  6. 【关键点 1】async/await 实现非阻塞异步,TPL 提供并行执行能力,二者场景不同。
  7. 【关键点 2】异步用于 I/O 密集,并行用于 CPU 密集,组合使用需谨慎。
  8. 【关键点 3】避免阻塞异步方法,使用 ConfigureAwait 优化库代码。
  9. 【关键点 4】使用 CancellationToken 和 SemaphoreSlim 控制并发与取消。
  10. 【关键点 5】性能优化重点在减少任务切换和同步开销,采用并发集合保证线程安全。
  11. 【易错点 1】将异步与并行混用,在 async 方法中直接 .Result 导致死锁。
  12. 【易错点 2】Parallel 循环中访问共享变量未同步,产生竞态条件。
  13. 【易错点 3】忽略上下文配置,在 UI 线程使用 sync-over-async 模式降低响应性。