我正在编写一个自定义调度程序,因此我希望触发当前运行时注册的任何任务,而不会花费太多时间调度程序错过下一个时隙。因此,我创建了一个线程,它一直睡到下一个预定的事件,然后它唤醒并运行下一个事件或事件,然后再次休眠。任务在后台运行为进程,因此我可以设置它们并尽快将它们关闭。为了便于记录控制进程,我保留了一个内部队列的任务,当我醒来时,我会消耗掉这些进程,但我也希望有一个EventHandler然后通过注册多长时间来完成该任务的日志记录。它一旦退出就会失败或成功。
因为我使用Process.Process()类在后台执行任务,所以我无法(我可以看到)将我的唯一任务引用传递给处理程序,因此我可以正确完成日志记录。我正在设置我的处理程序,如下面的代码。
pTask = new Process();
pTask.Exited += new EventHandler(pTask_Exited);
我故意在我的标题中使用了“搭载”一词,因为在我的研究中我遇到了一个similar question,它吸引了一个答案,说如果你需要在EventArgs上搭载数据,你的设计是有缺陷的。我可以接受我的设计可能存在缺陷,但是我无法找到关于如何以不同方式和更有效地设计它的启示。任何指导都表示赞赏。
答案 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;
}