当前位置: 首页 > news >正文

C#简单线程启动的几种方法总结

在 C# 中,单独开一个线程运行一段代码(如执行一句话)有多种方式,具体取决于使用的 .NET 版本和需求。以下是几种常见方法:


方法 1:使用 Thread 类(传统方式)

适用于所有 .NET 版本,但较底层。

using System.Threading;// 定义一个方法,包含要执行的代码
void DoWork()
{Console.WriteLine("这句话在新线程中运行!");
}// 创建并启动线程
Thread thread = new Thread(DoWork);
thread.Start(); // 启动线程// 可选:设置为后台线程(程序退出时自动结束)
thread.IsBackground = true;

方法 2:使用 Task(推荐,.NET 4.0+)

更现代的方式,基于线程池,适合异步操作。

using System.Threading.Tasks;Task.Run(() => 
{Console.WriteLine("这句话在Task线程池中运行!");
});// 或者异步方法
async Task ExecuteAsync()
{await Task.Run(() => Console.WriteLine("异步线程执行!"));
}
await ExecuteAsync();

优点

  • 自动管理线程池,避免频繁创建/销毁线程。

  • 支持 async/await 异步编程。


方法 3:ThreadPool(线程池)

适合短期任务,避免手动创建线程。

using System.Threading;ThreadPool.QueueUserWorkItem(_ => 
{Console.WriteLine("这句话在线程池中运行!");
});// 或者带参数
ThreadPool.QueueUserWorkItem(state => 
{Console.WriteLine($"参数: {state}");
}, "Hello");

适用场景

  • 简单、短生命周期的任务。

  • 不适合长时间运行的任务(可能阻塞线程池)。


方法 4:BackgroundWorker(WinForms/WPF 专用)

适合需要在 UI 线程中更新界面的场景。

using System.ComponentModel;var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => 
{Console.WriteLine("这句话在BackgroundWorker中运行!");
};
worker.RunWorkerAsync(); // 启动

方法 5:.NET 6+ 的 Parallel.Invoke

如果只是简单并行执行代码块:

Parallel.Invoke(() => 
{Console.WriteLine("这句话在并行任务中运行!");
});

如何选择?

方法适用场景备注
Thread需要精确控制线程(如优先级、前台/后台)底层,不推荐频繁使用
Task现代异步编程(推荐)默认用线程池,支持 async/await
ThreadPool短期任务避免阻塞线程池
BackgroundWorkerWinForms/WPF 后台任务自动回调 UI 线程
Parallel.Invoke简单并行执行适合 CPU 密集型任务

完整示例(控制台应用)

using System;
using System.Threading;
using System.Threading.Tasks;class Program
{static void Main(){// 方法1:Threadnew Thread(() => Console.WriteLine("Thread方式")).Start();// 方法2:TaskTask.Run(() => Console.WriteLine("Task方式"));// 方法3:ThreadPoolThreadPool.QueueUserWorkItem(_ => Console.WriteLine("ThreadPool方式"));Console.ReadLine(); // 防止主线程退出}
}

综上,选择 Task.Run 是最推荐的方式(简洁且高效),除非有特殊需求(如线程优先级)。

http://www.xdnf.cn/news/987787.html

相关文章:

  • Windows平台网络通信
  • SQL Server 查询数据库中所有表中所有字段的数据类型及长度
  • 从“字对字“到“意对意“:AI翻译正在重塑人类的语言认知模式
  • 从代码学习深度学习 - 全局向量的词嵌入(GloVe)PyTorch版
  • 医疗行业双碳战略升维:从合规达标到价值创造的转型路径
  • JavaWeb(JavaBean预习)
  • 智慧园区智能化整体解决方案
  • c#实现绝对路径和相对路径的转换
  • 黑马python(四)
  • CentOS Stream 9——RustDesk基础版自建教程(Docker)
  • <script> 标签的 async 与 defer 属性详解
  • 《Linux C编程实战》笔记番外:如何避免子进程成为僵尸进程
  • 阿里云unbantu、Flask部署模型的一个错误
  • 安卓+苹果端签名教程
  • SiteAzure:文章删除后,前台还能搜索到
  • HarmonyOS - UIObserver(无感监听)
  • TF-IDF算法的代码实践应用——关键词提取、文本分类、信息检索
  • 帆软 BI 从入门到实战全攻略(一):安装激活与添加数据
  • 大量RPM仓库管理指南:更新与批量获取实战手册
  • VS2017----打开ui文件几秒后闪退
  • 汇编(函数调用)
  • 刷新网站 favicon 的几种方法
  • 医院重症监护系统 ICU重症病房管理系统 重症监护软件
  • QT第一课 —— 设置CMake路径
  • Rust:在Windows上安装
  • BEV和OCC学习-7:mmdet3d 3D检测demo测试
  • 剑指offer21——反转链表
  • 使用html写一个倒计时页面
  • 将模型保存到kaggle中的model中
  • 解码 K-Means 聚类:开启数据星河的炫酷聚类新纪元