C# - 覆盖事件处理程序 - 添加参数

时间:2010-10-22 07:03:00

标签: c# events process override

我正在使用System.Diagnostics.Process类来执行命令行程序。

我使用OutputDataReceived方法将输出重定向到我自己的方法。

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

但是,我有多个线程运行此cmd程序的多个实例。我想要做的是能够识别输出数据来自哪个流程实例 - 理想情况下,是一个包含名称的字符串。 (每个进程在GUI上都有自己的进度条。我创建了另一个事件来将输出传递给GUI,因此,我需要知道数据来自哪个进程来更新进度条。)

我开始尝试:

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

然后我意识到我必须覆盖Process类中的OutputDataReceived方法。这反过来意味着我必须创建一个继承System.Diagnostics.Process的自定义类,并且有一个接受字符串参数的方法,以便OutputDataReceived事件可以将流程实例名称(字符串)传递给我的重写{ {1}}。

问题的目的是就如何进行提出一些意见。我的建议似乎是实现我想要的正确方法吗?或者,有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

你能不能只使用传回的sender对象并检查它正在运行哪个进程?

答案 1 :(得分:5)

除了使用sender的现有答案之外,您还可以使用lambda表达式(或匿名方法)来简化:

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

其中HandleData的签名为

void HandleData(Process process, DataReceivedEventArgs e)

匿名函数是一种非常方便的方式,可以在事件订阅时将本地已知的信息传播到需要处理事件的代码。

答案 2 :(得分:2)

您可以将sender参数类型转换为Process对象(代码段中的pr