正在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 = ;
while (!(collectPathItems.Count == && taskItems.Count == ))
{
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 == )
{
Thread.Sleep(3 * );
continue;
} Process[] processItems = Process.GetProcessesByName("AutoCollectMrMultipleProcess");
if (processItems.Length >= maxProcessCount)
{
Thread.Sleep(3 * );
continue;
} int dequeueCount = ((maxProcessCount - processItems.Length) > collectPathItems.Count) ? collectPathItems.Count : (maxProcessCount - processItems.Length); for (int i = ; 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 * );
cursor++;
}

最新文章

  1. 关于Response.Redirect 端口不一致的跳转
  2. shell 中调用其他的脚本
  3. mount: unknown filesystem type &#39;ntfs&#39;
  4. 最牛逼android上的图表库MpChart(二) 折线图
  5. IOC基础
  6. invoke和beginInvoke
  7. 【题解】【数组】【查找】【Leetcode】Search in Rotated Sorted Array
  8. linux 线程的内核栈是独立的还是共享父进程的?
  9. puppet cert maintain
  10. openNebula rgister img instance vms error collections
  11. 一、Mongo的安装
  12. Go - Revel框架介绍
  13. Python脱产8期 Day07 2019/4/19
  14. Kotlin中构造方法的参数var val 和 什么都没有的区别
  15. [leetcode]57. Insert Interval插入区间
  16. JavaScript循环和数组常用操作
  17. 让你的Python代码更加pythonic
  18. 从头认识java-18.2 主要的线程机制(2)-Executors的使用
  19. select和epoll概念
  20. mysql 索引、查询优化

热门文章

  1. C语言最后一次作业--总结报告
  2. jsp的两种跳转方式和区别
  3. 笔记:Hibernate 二级缓存
  4. delete与delete[]的区别
  5. 图解script的三种加载方式 异步加载顺序
  6. [HNOI2002]营业额统计_Treap
  7. shell之九九乘法表
  8. Android权限Uri.parse的几种用法(转载)
  9. String s=new String(&quot;abc&quot;)创建了几个对象?
  10. 高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告