Очередь выполнения - PullRequest
       19

Очередь выполнения

0 голосов
/ 21 сентября 2018

Мне нужно обработать 100 единиц информации через внешнюю программу.Эти процессы могут быть интенсивными, поэтому мне нужно ограничить их обработкой 8 за раз.По сути, я хотел бы запустить 8 процессов, а после завершения каждого из них запустить следующий.

Я пытался использовать TPL в System.Threading.Tasks.Dataflow с приведенным ниже кодом, но все 100запуск, а не только 8 за раз.

// This file has the command line parameters to launch the external process
List<string> lines = File.ReadAllLines(file).ToList();
var block = new ActionBlock<string>(async job => await RunJob(job), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 1 });
foreach (string line in lines)
        {
            block.SendAsync(line);

        }

static async Task RunJob(string parms)
        {
            //Console.WriteLine("PARMS: {0}", parms);
            Process proc = new Process();
            ProcessStartInfo start = new ProcessStartInfo();
            start.WindowStyle = ProcessWindowStyle.Normal;
            start.FileName = @"C:\program.exe";
            string parameters = String.Format(parms.ToString());
            start.Arguments = parameters;
            start.UseShellExecute = true;
            proc.StartInfo = start;
            proc.Start();
        }

Что я пропустил?Спасибо за помощь.

1 Ответ

0 голосов
/ 21 сентября 2018

Процесс начинается немедленно, но вы не ждете, пока процесс завершится.Используйте proc.WaitForExit();

static async Task RunJob(string parms)
{
    //Console.WriteLine("PARMS: {0}", parms);
    Process proc = new Process();
    ProcessStartInfo start = new ProcessStartInfo();
    start.WindowStyle = ProcessWindowStyle.Normal;
    start.FileName = @"C:\program.exe";
    string parameters = String.Format(parms.ToString());
    start.Arguments = parameters;
    start.UseShellExecute = true;
    proc.StartInfo = start;
    proc.Start();
    proc.WaitForExit();
}
...