C # - переопределение обработчика событий - добавление параметра - PullRequest
2 голосов
/ 22 октября 2010

Я использую класс System.Diagnostics.Process для выполнения программы командной строки.

Я использую метод OutputDataReceived, чтобы перенаправить вывод в мой собственный метод.

pr.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived);
pr.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceived);

Однако у меня есть несколько потоков, выполняющих несколько экземпляров этой программы cmd. Что я хочу сделать, так это уметь определить, из какого экземпляра процесса пришли выходные данные - в идеале - строка, содержащая имя. (У каждого процесса есть свой индикатор выполнения в графическом интерфейсе. Я создаю другое событие для передачи вывода в графический интерфейс, поэтому мне нужно знать, из какого процесса поступили данные, чтобы обновить свой индикатор выполнения).

Я начал экспериментировать с:

public override delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e, string processName);

Затем я понял, что мне придется переопределить метод OutputDataReceived внутри класса Process. Что, в свою очередь, означало бы, что мне нужно создать собственный класс, который наследует System.Diagnostics.Process, и иметь метод, который принимает строковый аргумент, чтобы событие OutputDataReceived могло передать имя экземпляра процесса (строку) моему переопределенному DataReceivedEventHandler.

Цель этого вопроса - получить некоторые мнения о том, как действовать. Кажется ли то, что я предлагаю, правильным путем для достижения того, чего я хочу? Или есть лучший способ сделать это?

Ответы [ 3 ]

5 голосов
/ 22 октября 2010

Помимо существующих ответов об использовании sender, вы также можете использовать лямбда-выражения (или анонимный метод), чтобы сделать это проще:

pr.OutputDataReceived += (sender, args) => HandleData(pr, args);

где HandleData будет иметь подпись

void HandleData(Process process, DataReceivedEventArgs e)

Анонимные функции - это очень удобный способ распространения информации, известной локально во время подписки на событие, в код, который должен обрабатывать событие.

5 голосов
/ 22 октября 2010

Разве вы не можете просто использовать переданный обратно объект sender и проверить, какой процесс он выполняет?

2 голосов
/ 22 октября 2010

Можно указать тип параметра sender для объекта Process (pr в вашем фрагменте кода)

...