Parallel.ForEach () отсутствует элемент при использовании процесса - PullRequest
0 голосов
/ 03 сентября 2018

Я получаю стандартную ошибку от большого числа процессов, запущенных из цикла foreach. Это сработало отлично, и я получил правильное количество исключений, возвращенных в. Когда я пытаюсь использовать Parallel.ForEach (), он возвращает только 50% исключений.

Parallel.ForEach, который вызывает LaunchProcessHandler

public ConcurrentBag<IO_Exception_Check_Result> RunCheck()
    {
        List<string> array = JsonConvert.DeserializeObject<List<string>>(System.IO.File.ReadAllText(testInputPath));

        ConcurrentBag<IO_Exception_Check_Result> results = new ConcurrentBag<IO_Exception_Check_Result>();

        StringBuilder stdoutxTemp = new StringBuilder();
        StringBuilder stderrxTemp = new StringBuilder();

        Parallel.ForEach(array, item =>
        {
            StringBuilder stdoutx = new StringBuilder();
            StringBuilder stderrx = new StringBuilder();

            Process process = LauchProcessHandler(ref stdoutx, ref stderrx);

            for (int i = 0; i < 20; i++)
            {
                process.StandardInput.WriteLine(item);
            }

            try
            {
                if (!process.WaitForExit(timeout))
                {
                    process.Kill();
                }
            }
            catch
            {
                Console.WriteLine("Process already killed");
            }

            if (!string.IsNullOrEmpty(stderrx.ToString()))
            {
                results.Add(new IO_Exception_Check_Result(item, stdoutx.ToString(), stderrx.ToString()));
            }
        });

        return results;

Метод LaunchProcessHandler, который вызывается для запуска процесса.

private Process LauchProcessHandler(ref StringBuilder stdoutxParam, ref StringBuilder stderrxParam)
    {
        StringBuilder stdoutx = new StringBuilder();
        StringBuilder stderrx = new StringBuilder();

        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            RedirectStandardError = true,
        };

        if (LocalUseDotnetCLI)
        {
            startInfo.FileName = "dotnet";
            startInfo.Arguments = $"run --project {appPath} {arguments}";
            //startInfo.WorkingDirectory = startInfo.Arguments;
        }
        else
        {
            startInfo.FileName = appPath;
            startInfo.Arguments = arguments;
        }

        Process process = new Process();
        process.StartInfo = startInfo;

        process.Start();

        process.OutputDataReceived += (object sender, System.Diagnostics.DataReceivedEventArgs e) => stdoutx.Append(e.Data);
        process.ErrorDataReceived += (object sender, System.Diagnostics.DataReceivedEventArgs e) => stderrx.Append(e.Data);

        process.BeginOutputReadLine();
        process.BeginErrorReadLine();

        stdoutxParam = stdoutx;
        stderrxParam = stderrx;

        return process;
    }

Если есть лучшее решение для повышения производительности, чем использование Parallel.ForEach (), мне также будет интересно.

...