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

请说明在 C# 中实现多线程编程的常见方式,并比较 Task 与 Thread 在使用上的主要不同点,包括它们各自的适用场景。

技术原理方案权衡C#

考察说明

考查对 C# 多线程基础及 Task 与 Thread 差异的理解,以及实际编程中的选择能力。

回答思路

  1. 【回答框架 1】C# 实现多线程的常见方式包括 Thread 类、ThreadPool 以及基于任务的 Task。Thread 直接创建操作系统线程,资源消耗较大;ThreadPool 复用线程,减少创建开销,但不易控制;Task 基于线程池提供更高级抽象,支持异步等待、取消和组合。
  2. 【回答框架 2】Task 与 Thread 的主要区别:Task 默认在线程池线程上执行,而 Thread 是专用线程;Task 支持 async/await 异步编程模型,而 Thread 没有;Task 可以返回结果并通过 ContinueWith 或 await 链式处理,Thread 只能通过回调或共享字段传递;Task 更容易实现取消 (CancellationToken) 和异常传播。
  3. 【回答框架 3】适用场景:对于短期、异步或需要返回值的工作,优先使用 Task;对于需要长期运行、独立控制生命周期 (如设置优先级、Abort) 或底层操作,才考虑 Thread;批量异步 I/O 或 CPU 密集型任务并行处理时,结合 Task 和 Parallel 类更合适。
  4. 【回答框架 4】在 C# 中,多线程编程还需考虑线程安全,如使用 lock、Monitor、Interlocked 或 Concurrent 集合保护共享状态;异步编程需关注上下文和死锁风险。
  5. 【关键点 1】Task 是高层次抽象,基于线程池,支持异步等待和结果返回;Thread 是底层线程对象。
  6. 【关键点 2】Task 默认线程池线程,Thread 创建独立 OS 线程,开销更大。
  7. 【关键点 3】Task 通过 async/await 和 CancellationToken 更好地支持异步与取消。
  8. 【关键点 4】选择时优先考虑 Task,除非需要长期运行或精细控制线程生命周期。
  9. 【易错点 1】Task 默认在线程池调度,不保证长期运行任务独占线程,长时间阻塞可能影响线程池性能,可设置 LongRunning 选项。
  10. 【易错点 2】不要用 Abort 终止线程,应使用协作式取消。
  11. 【易错点 3】异步代码中避免阻塞调用,如 Task.Result,防止死锁。