В каком потоке обрабатывается и обрабатывается Process.OutputDataReceived? - PullRequest
9 голосов
/ 13 апреля 2011

У меня есть многопоточное приложение winforms.Один поток для графического интерфейса и один поток для фоновой обработки.В фоновой обработке я связываюсь с внешним процессом через класс Process для отправки полученных данных.

Я не понимаю, в каком потоке запущен обработчик, который я зарегистрировал Process.OutputDataReceived.Согласно документации MS: «Событие OutputDataReceived указывает, что связанный процесс записал в свой перенаправленный поток StandardOutput».Но не ясно, кто вызывает событие.

См. Пример кода ниже:

myProc= new Process();
myProc.StartInfo.UseShellExecute = false;
myProc.StartInfo.RedirectStandardOutput = true;
myProc.StartInfo.RedirectStandardError = true;
myProc.StartInfo.RedirectStandardInput = true;
myProc.StartInfo.FileName = "myapp.exe";
myProc.StartInfo.Arguments = arguments;
myProc.StartInfo.CreateNoWindow = true;
myProc.OutputDataReceived += new DataReceivedEventHandler(DataReceivedFromProc);
myProc.ErrorDataReceived += new DataReceivedEventHandler(ErrorReceivedFromProc);
myProc.Start();
myOutputStream = myProc.StandardInput;
myProc.BeginOutputReadLine();
myProc.BeginErrorReadLine();

Итак, в каком случае в каком потоке работает DataReceivedFromProc?Имеет ли это значение, если вышеупомянутое выполнено в моем потоке GUI против рабочего потока?

Ответы [ 2 ]

5 голосов
/ 13 апреля 2011

Вы должны установить myProc.SynchronizingObject свойство для вашей формы или элемента управления.

В противном случае, я считаю, что событие будет вызвано в потоке завершения ввода-вывода (из ThreadPool).

1 голос
/ 31 августа 2011

См. Также комментарий пользователя в самом низу этой страницы :

Process.OutputDataReceived вызывается в потоке, отличном от того, который создавал и настраивал объект Processи запустил процесс.

Если экземпляр объекта Process создается в основном потоке (или пользовательском интерфейсе), вы не сможете обновить пользовательский интерфейс, запущенный в этом потоке, из обработчика события OutputDataReceived.Вместо этого вам придется использовать делегатов для отправки сообщения в основной поток для обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...