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

C#中线程池【异步】

在 WinForm 项目中,线程池中的线程主要用于执行异步和并发任务。当你调用某些异步方法或使用并行编程时,线程池中的线程就会被使用。

在以下场景中,线程池的线程会被使用:

使用场景

  1. 异步任务执行
    当你使用 Task.Run()TaskFactory.StartNew() 来启动一个异步任务时,线程池会为这些任务分配线程。
Task.Run(() =>
{// 这个代码块会在线程池中的线程上运行DoSomeWork();
});
  1. 异步事件驱动 (BeginInvoke(), 异步委托)
    当你使用 异步事件处理 或 回调机制,比如 BeginInvoke()、委托的异步调用(Async delegates),或者其他异步 I/O 操作时,线程池中的线程会被用来处理完成事件。
Action myAction = new Action(SomeMethod);
myAction.BeginInvoke(null, null);  // 异步执行
  1. 异步 I/O 操作(网络、文件、数据库)
    如果你在项目中进行 I/O 操作,比如 网络请求(HttpClient 或 Socket)、文件读取/写入、数据库操作 等,特别是这些操作是异步完成的,I/O 线程会从线程池中获取。
using (HttpClient client = new HttpClient())
{var response = await client.GetAsync("https://example.com");  // 异步网络请求
}
  1. 并行编程(Parallel.For())
    如果你使用了 Parallel.ForParallel.ForEach 来执行并行任务,这些任务会分配到线程池中的工作线程上。
Parallel.For(0, 100, i =>
{DoWork(i);  // 这个方法将在多个线程池线程中并行执行
});
  1. 定时器回调(Timer)
    当你使用 System.Threading.TimerSystem.Timers.Timer 来处理周期性任务时,定时器触发时也会从线程池中获取一个线程来执行回调方法。
Timer timer = new Timer(CallbackMethod, null, 0, 1000);  // 每隔1秒触发一次回调
  1. Web API 请求处理
    如果你在 WinForm 项目中托管了一个 Web API 服务(比如通过 HttpListenerWebAPI),每个 HTTP 请求处理时都会从线程池中获取一个线程来处理请求。
  2. 后台工作任务(BackgroundWorker)
    如果你使用 BackgroundWorker 来执行后台操作,线程池也会用来运行这些操作。
    例子:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, e) =>
{// 在线程池的线程中执行DoBackgroundWork();
};
worker.RunWorkerAsync();
  1. 异步编程模式(async/await)
    如果你在委托调用中使用了 asyncawait,同样也可能会使用线程池。通常,await 后的代码会在线程池中的线程继续执行,尤其是在处理 I/O 操作时(如网络通信、文件读写等)。
public async void ProcessDataAsync()
{
//在这种情况下,Task.Run 将委托放到线程池中的线程执行。	await Task.Run(() => RemoteMoveTCPServer.ReceiveDataProcess("Some message"));
}

一般在项目中,会在主程序Program.cs中设置线程池最小和最大线程数。

	ThreadPool.SetMinThreads(5, 5);ThreadPool.SetMaxThreads(50, 50);

ThreadPool.SetMinThreads(5, 5):表示

  • 两个参数分别表示:工作线程(worker threads)和异步 I/O 线程(I/O completion threads);
  • 当有并发任务时,线程池会至少保留 5 个工作线程和 5 个异步 I/O 线程,即- 使在系统负载较低的情况下,也会保持这些最小数量的线程。
  • 作用:避免在需要执行大量任务时频繁地创建新线程,提升线程创建的响应速度。
    ThreadPool.SetMaxThreads(50, 50):表示
  • 设置线程池的最大线程数:这个方法设置线程池中可用线程的最大数量。这里的参数 (50, 50) 表示线程池中的工作线程和异步 I/O 线程的最大数量限制为 50。
  • 当并发任务数超过这个上限时,多余的任务会被排队等待,直到有可用的线程。
  • 作用:限制线程池创建的线程数,防止由于创建过多线程导致系统资源(如 CPU 和内存)过度消耗。

线程池机制不仅适用于 C# 和 .NET 框架,也广泛存在于其他编程语言中,尤其是那些支持并发编程和多线程的语言。虽然每种语言的实现方式和细节可能有所不同,但线程池的基本思想和目的在各类编程语言中是相似的:有效管理和复用线程资源,减少线程创建和销毁的开销,优化并发任务的处理效率。

http://www.lryc.cn/news/441721.html

相关文章:

  • OpenAI 刚刚推出 o1 大模型!!突破LLM极限
  • 【Vmware16安装教程】
  • Delphi5利用DLL实现窗体的重用
  • 使用JavaWeb开发注册功能时,校验用户名是否已存在的一个思路(附代码)
  • 前端常见面试-首页性能提升、项目优化
  • 卷王阿里又开启价格战,大模型价格降价85%!
  • Java中的异步编程模式:CompletableFuture与Reactive Programming的实战
  • 7iDU AMP田岛绣花机驱动器维修0J2100400022
  • 部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现
  • vue websocket 使用
  • Spring Boot 入门面试五道题
  • 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)
  • 国产品牌 KTH1701系列 高性能、低功耗、全极磁场检测霍尔开关传感器
  • 如何不终止容器退出Docker Bash会话
  • 杰理芯片各型号大全,方案芯片推荐—云信通讯
  • 解决服务器首次请求异常耗时问题
  • VS code 创建与运行 task.json 文件
  • 【电商API接口定价】618品牌定价参考(电商API接口数据采集)
  • PyRFC 适用于 Python 的异步、非阻塞 SAP NetWeaver RFC SDK 绑定
  • 解决matplotlib画中文时缺乏中文字体问题。
  • 小琳AI课堂 掌握强化学习:探索OpenAI Gym的魅力与Python实战
  • 1.3 等价类划分法
  • 概率论原理精解【15】
  • 【新手上路】衡石分析平台系统管理手册-安全管理
  • 【Matlab】matlab 结构体使用方法
  • Mamba YOLO World
  • JVM 内存模型:堆、栈、方法区讲解
  • 24年蓝桥杯及攻防世界赛题-MISC-2
  • openssl-AES-128-CTR加解密char型数组分析
  • 自动化生成与更新 Changelog 文件