zoukankan      html  css  js  c++  java
  • .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
  • 相关阅读:
    StarUML中时序图
    HTML5/jQuery雷达动画图表 图表配置十分简单
    AspNetPager样式以及属性帮助文档
    IE浏览器img不显示解决
    php表单提交--文件
    javascript继承---组合式继承
    javascript继承--原型链的 继承
    【转】JavaScript 之arguments、caller 和 callee 介绍
    Array对象
    android 系统提示对话框(AlertDialog)的使用
  • 原文地址:https://www.cnblogs.com/yidanda888/p/15584281.html
Copyright © 2011-2022 走看看