在EventArgs或EventHandler的发送方上捎带数据

时间:2013-01-24 01:19:43

标签: c#

我正在编写一个自定义调度程序,因此我希望触发当前运行时注册的任何任务,而不会花费太多时间调度程序错过下一个时隙。因此,我创建了一个线程,它一直睡到下一个预定的事件,然后它唤醒并运行下一个事件或事件,然后再次休眠。任务在后台运行为进程,因此我可以设置它们并尽快将它们关闭。为了便于记录控制进程,我保留了一个内部队列的任务,当我醒来时,我会消耗掉这些进程,但我也希望有一个EventHandler然后通过注册多长时间来完成该任务的日志记录。它一旦退出就会失败或成功。

因为我使用Process.Process()类在后台执行任务,所以我无法(我可以看到)将我的唯一任务引用传递给处理程序,因此我可以正确完成日志记录。我正在设置我的处理程序,如下面的代码。

pTask = new Process();
pTask.Exited += new EventHandler(pTask_Exited);

我故意在我的标题中使用了“搭载”一词,因为在我的研究中我遇到了一个similar question,它吸引了一个答案,说如果你需要在EventArgs上搭载数据,你的设计是有缺陷的。我可以接受我的设计可能存在缺陷,但是我无法找到关于如何以不同方式和更有效地设计它的启示。任何指导都表示赞赏。

2 个答案:

答案 0 :(得分:1)

您可以使用lambdas实现此目的,如下所示:

首先定义一个在进程退出时运行的方法。这将代替您当前使用的任何事件处理程序,并执行必要的日志记录等。:

void ExitHandler(Process process, YourTaskInfo taskInfo) // YourTaskInfo is some class that contains data about the task that needs to be passed to the handler
{
    Console.WriteLine("Process for task: {0} exited with code: {1}", taskInfo, process.ExitCode);
}

然后,您可以将此方法附加到Exited事件处理程序,如下所示:

pTask.Exited += (s,e) => ExitHandler(pTask, taskInfo);

通过这种方式,您可以将唯一任务引用(taskInfo)传递给Exited处理程序,而无需担心发件人或EventArgs上的任何“捎带”等。

答案 1 :(得分:0)

Process本身获取数据,该数据作为sender传递:

void pTask_Exited(object sender, EventArgs e)
{
    Process p = (Process)sender;
    TimeSpan duration = p.ExitTime - p.StartTime;
    bool success = p.ExitCode == 0;
}