2010-10-22 90 views
2

我正在使用System.Diagnostics.Process类来执行命令行程序。C# - 重写事件处理程序 - 添加参数

我正在使用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事件可以将流程实例名称(字符串)传递给我的覆盖的DataReceivedEventHandler

问题的目的是获得一些关于如何进行的意见。我提出的建议似乎是正确的方式来实现我想要的吗?或者,有没有更好的方法来做到这一点?

+0

只需创建一个小帮手类。它可以将Process实例以及您需要的任何其他状态存储为专用字段。 – 2010-10-22 07:36:22

回答

5

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

+0

发件人对象中没有信息来识别它是哪个进程。 – nf313743 2010-10-22 07:20:56

+0

查看过程属性。我可以使用Process.StartInfo.Domain属性设置进程名称。由于Domain不应该像这样被使用,所以可能不是很好的编程实践,但它应该可以工作。 – nf313743 2010-10-22 07:39:58

2

您可以强制转换(在你的代码片段pr)发送参数Process对象

5
从使用 sender现有答案

除此之外,您还可以使用lambda表达式(或匿名方法),使这个简单:

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

其中HandleData将有一个签名

void HandleData(Process process, DataReceivedEventArgs e) 

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