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

标签 c# events process overriding

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

问题的目的是获得一些关于如何进行的意见。我提出的建议是否是实现我想要的目标的正确方法?或者,有更好的方法吗?

最佳答案

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

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

HandleData 的签名是

void HandleData(Process process, DataReceivedEventArgs e)

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

关于C# - 覆盖事件处理程序 - 添加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3994599/

相关文章:

c# - 如何在 lambda 表达式中忽略转换为可空?

c# - 如何在 wpf 用户控件中收听 INotifyCollectionChanged

AngularJS:错误:事件未定义(仅Firefox)

events - 如何在静态 UML 模型中表示基于事件的架构?

c# - 没有注册类型 'Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory' 的服务

c# - 对现有 blob 进行编码,而不是从本地文件夹上传

c# - 如何将 lambda 表达式事件分配给另一个事件

Python连接套接字进行处理

Python - 在 "detached"进程中生成函数的最佳方式

c# - 向父进程发出子进程已完全初始化的信号