.Net 多线程,异步且控制并发数量
场景是批量上传图片,所以使用了并发。因为服务器电脑也是有瓶颈的,且多线程也不能无限开。。
所以我在使用多线程异步上传的同时,同时控制线程并发的数量,线程数量达到阈值之后,得等待一个成功结束之后,再开启另一个新的线程。。
主要使用:Task.WaitAny() 这个API,传一个线程数组, 等待其中一个执行完成,只等最快的一个执行完成。。每个线程在打开之前去判断正在运行的线程的数量
控制最大线程数量为4。 代码:
//控制并发线程的数量 List<Task> tasks = new List<Task>(); for (int i = 0; i < 50; i++) { int k = i; Console.WriteLine($"运行数量为**{tasks.Count(t => t.Status == TaskStatus.Running)}***"); if (tasks.Count(t => t.Status == TaskStatus.Running) > 3) { var runID = tasks.Count(t => t.Status == TaskStatus.Running); Console.WriteLine($"运行数量为**{runID},大于3个了,请稍等***"); Task.WaitAny(tasks.ToArray()); tasks = tasks.Where(t => t.Status != TaskStatus.RanToCompletion).ToList(); } else { var taskItem = Task.Run(() => { Console.WriteLine($"打开新线程**{k} ***{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); //处理固定的工作 Thread.Sleep(2000); }); tasks.Add(taskItem); } }
效果:
第二种方法: 利用 Parallel类来操作,通过MaxDegreeOfParallelism参数控制最大额并行数量。
Task.Run(() => { ParallelOptions parallelOptions = new ParallelOptions(); parallelOptions.MaxDegreeOfParallelism = 3; Parallel.For(0, 10, parallelOptions, i => WorkTest("das")); });
效果: 达到阈值之后,等待一个线程完成之后,才会开启另一个线程。。
这样就可以控制多线程并发数量啦。
分类: .NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现