C# 过程管理

C# 过程管理,c#,.net,multithreading,C#,.net,Multithreading,我们正在尝试实施一个启动流程的程序。但同时,内存中最多可以运行2个进程。如果进程数超过2个,则会因许可策略而出现异常。所以基本上我们需要等到2个进程结束,然后再开始另2个进程,直到我们完成。 我试图检查内存中是否有2个或更多进程,然后使线程休眠,但它似乎无法正常工作 while (Process.GetProcesses().Where(x => x.ProcessName == "myProcessName").Count() >= 2) { Thread.Sleep(100);

我们正在尝试实施一个启动流程的程序。但同时,内存中最多可以运行2个进程。如果进程数超过2个,则会因许可策略而出现异常。所以基本上我们需要等到2个进程结束,然后再开始另2个进程,直到我们完成。 我试图检查内存中是否有2个或更多进程,然后使线程休眠,但它似乎无法正常工作

while (Process.GetProcesses().Where(x => x.ProcessName == "myProcessName").Count() >= 2)
{
 Thread.Sleep(100);
}
//Start next process

有什么想法吗?非常感谢

似乎您需要确保atmax 2进程一次运行

似乎您需要确保atmax 2进程一次运行

您可以启动进程,并等待退出的事件重新启动另一个进程,如下所示:

using System;
using System.Diagnostics;

namespace ConsoleApplication1 {
    class Program {
        static void StartProcess(string Path) {
            Process Process = Process.Start(Path);
            Process.EnableRaisingEvents = true;
            Process.Exited += (sender, e) => {
                StartProcess(Path);
            };
        }

        static void Main(string[] args) {
            for (int i = 0; i < 2; i++) {
                StartProcess("notepad");
            }
            Console.ReadLine();
        }
    }
}

您可以启动进程并等待退出的事件重新启动另一个进程,如下所示:

using System;
using System.Diagnostics;

namespace ConsoleApplication1 {
    class Program {
        static void StartProcess(string Path) {
            Process Process = Process.Start(Path);
            Process.EnableRaisingEvents = true;
            Process.Exited += (sender, e) => {
                StartProcess(Path);
            };
        }

        static void Main(string[] args) {
            for (int i = 0; i < 2; i++) {
                StartProcess("notepad");
            }
            Console.ReadLine();
        }
    }
}

<>这将考虑已经运行的进程,并且如果先前运行的进程全部退出,也只启动新进程。

string processName = "calc";
int processCount = 2;

while ( true )
  {
  while ( Process.GetProcessesByName( processName ).Count() < processCount )
    {
    Process.Start( processName );
    }

  var tasks = from p in Process.GetProcessesByName( processName )
              select Task.Factory.StartNew( p.WaitForExit );
  Task.WaitAll( tasks.ToArray() ); 
  }

<>这将考虑已经运行的进程,并且如果先前运行的进程全部退出,也只启动新进程。

string processName = "calc";
int processCount = 2;

while ( true )
  {
  while ( Process.GetProcessesByName( processName ).Count() < processCount )
    {
    Process.Start( processName );
    }

  var tasks = from p in Process.GetProcessesByName( processName )
              select Task.Factory.StartNew( p.WaitForExit );
  Task.WaitAll( tasks.ToArray() ); 
  }

我们找到了临时解决办法:

while (true)
  {
    lock (_lock)
    {
      if (Process.GetProcesses().Where(x => x.ProcessName == "processName").Count() < GetProcessNumber)
      {
        //do Smth
        break;
      }
      Thread.Sleep(1000);
    }
  }

我们找到了临时解决办法:

while (true)
  {
    lock (_lock)
    {
      if (Process.GetProcesses().Where(x => x.ProcessName == "processName").Count() < GetProcessNumber)
      {
        //do Smth
        break;
      }
      Thread.Sleep(1000);
    }
  }

什么例外?是否要控制自己流程的实例化?如果您在尝试等待流程存在时遇到问题。。。使用Process.WaitforExit方法@Yahya我只想在内存中保留2个进程。我没有实例化它们,我只是想让它们等待,因为只有两个例外?是否要控制自己流程的实例化?如果您在尝试等待流程存在时遇到问题。。。使用Process.WaitforExit方法@Yahya我只想在内存中保留2个进程。我没有实例化它们,我只是想让它们等待,因为只有两个人的位置看起来像优雅的解决方案看起来像优雅的解决方案