C #, вывод процессов иногда не фиксируется (несоответствие)? - PullRequest
1 голос
/ 28 июля 2011

Программа, которую я создал, сбрасывает потоки, которые запускают исполняемые файлы через процессы.Каждый поток запускает метод ниже, который запускает процесс и перенаправляет вывод процессов в строку (info.additional, который для каждого процесса).Через много проб и ошибок я узнал, что я должен перенаправлять вывод определенным образом (используя события для полученного вывода) или же блокировать потоки.Теперь я работаю на двухъядерной машине, и если у меня два запущенных потока и запускаются процессы, программа работает отлично и отлично фиксирует выходные данные этих процессов.Но когда я перехожу к более чем двум потокам (больше потоков, чем у меня есть ядра), вывод иногда не захватывается для них.Почему это?И кто-нибудь знает, как это исправить?Спасибо, Джо

    public void ThreadProc()
    {
        info.watch.Start();
        proc = InstantiateProcess();
        proc.Start();
        proc.BeginOutputReadLine();
    }


    private void procOutputDataReceived(object sendingProcess, DataReceivedEventArgs e)
    {
        if (e.Data != null)
        {
            //Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
            this.info.additional += e.Data.ToString();
        }
    }

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Не уверен, что это может быть причиной проблемы, но, исходя из приведенного здесь кода, ваш ThreadProc завершает работу до того, как объект Process будет создан.Согласно документам OutputDataReceived , вы должны вызывать WaitForExit() «Приложение, обрабатывающее асинхронный вывод, должно вызвать метод WaitForExit (), чтобы убедиться, что буфер вывода очищен».Исходя из этой строки, я бы предположил, что вы можете потерять некоторые данные, если вы этого не сделаете.

На несвязанной ноте Process объекты реализуют IDisposable, поэтому я бы порекомендовал изменить ваш метод ThreadProc следующим образом (обратите внимание, я нездесь нет объявления proc, но, как вы говорите, вы запускаете несколько процессов, я предполагаю, что proc не является переменной-членом, и объявление было просто опущено в образце):

public void ThreadProc()
{
    info.watch.Start();
    using (var proc = InstantiateProcess())
    {
        proc.Start();
        proc.BeginOutputReadLine();
        proc.WaitForExit();
    }
}
0 голосов
/ 28 июля 2011

Если вы не убедитесь, что сохраните ссылки на объекты Process, они будут собирать мусор, и в этом случае события на них перестанут срабатывать.

Простое решение:

  • хранить объекты Process до тех пор, пока процесс не будет остановлен
...