zoukankan      html  css  js  c++  java
  • C#:多进程开发,控制进程数量

    正在c#程序优化时,如果多线程效果不佳的情况下,也会使用多进程的方案,如下:

    System.Threading.Tasks.Task task=System.Threading.Tasks.Task.Factory.StartNew(
                            (object mystate) =>
                            {
                                Process process = Process.Start("AutoCollectMrMultipleProcess.exe", mystate.ToString());
                                process.WaitForExit();
                            }
                           , collectPathItems.Dequeue())

    使用c#中的Process开启线程,并运行一个c#编译的一个Console的业务工程,Console.exe通过接收参数决定并行进程中的每个进程处理具体的任务:例如,实现一个多进程下载,传递给每个进程.exe的参数就是待采集的路径。

    一般开辟的进程任务数也是要有限制的开,比如开辟进程数与计算机内核数一样Enviroment.ProcessCount。那么问题来了

    问题一:如何在一个c#业务代码确保同时运行的进程数量确保尽量都是最大进程数呢?

    假设:我们有25个带下待的任务,有的任务是1个小时左右才能完成、有的10分钟就完成了,如何确保一个完整的业务代码中去确保10分钟完成后,发现当前的进程数还未达到最大数,而且还有待处理任务,就继续开辟新的下载进程任务。

    问题二:上边提到的进程最大数,也包含计算机中其他用户开辟的进程数。

    假设用A:已经开辟了3个AutoCollectMrMultipleProcess.exe,用户B去进行自己的采集任务时,允许开辟的进程数为:Enviroment.ProcessCount-3(如果该值已经小于等于0,就不再开辟,进入等待)。

    问题三:如何确保业务处理是同步的。

    实现代码:

                int maxProcessCount = Enviroment.ProcessCount;
                List<System.Threading.Tasks.Task> taskItems = new List<System.Threading.Tasks.Task>();
                Queue<string> collectPathIetms=new Queue<string>();
    // 初始化下载任务记录start
    。。。
    // 初始化下载任务记录end
    int cursor = 0; while (!(collectPathItems.Count == 0 && taskItems.Count == 0)) { foreach (System.Threading.Tasks.Task taskItem in new List<System.Threading.Tasks.Task>(taskItems)) { if (taskItem.Status == System.Threading.Tasks.TaskStatus.Canceled || taskItem.Status == System.Threading.Tasks.TaskStatus.Faulted || taskItem.Status == System.Threading.Tasks.TaskStatus.RanToCompletion) { taskItems.Remove(taskItem); } } // 如果collectPathItems.Count == 0,则不会有新的任务被添加进来,因此不需要执行下边其他代码。 // 而只需要等待上边的任务完成跳出循环即可。 if (collectPathItems.Count == 0) { Thread.Sleep(30 * 1000); continue; } Process[] processItems = Process.GetProcessesByName("AutoCollectMrMultipleProcess"); if (processItems.Length >= maxProcessCount) { Thread.Sleep(30 * 1000); continue; } int dequeueCount = ((maxProcessCount - processItems.Length) > collectPathItems.Count) ? collectPathItems.Count : (maxProcessCount - processItems.Length); for (int i = 0; i < dequeueCount; i++) { taskItems.Add(System.Threading.Tasks.Task.Factory.StartNew( (object mystate) => { Process process = Process.Start("AutoCollectMrMultipleProcess.exe", mystate.ToString()); process.WaitForExit(); } , collectPathItems.Dequeue()) ); }
    // sleep 30 seconds... Thread.Sleep(3
    0 * 1000); cursor++; }
  • 相关阅读:
    JQuery 判断某个属性是否存在 hasAttr
    微信支付开发-Senparc.Weixin.MP详解
    c# 两个数组比较,将重复部分去掉,返回不重复部分
    String.Format数字格式化输出 {0:N2} {0:D2} {0:C2
    asp.net 时间比较,常用于在某段时间进行操作
    关于C#正则表达式MatchCollection类的总结,正则表达式的应用
    开发错误11:Configuration with name ‘default’ not found
    Android新旧版本Notification
    Okio 1.9简单入门
    Android  PNG透明图片转JPG格式背景变黑
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/7538847.html
Copyright © 2011-2022 走看看