0

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

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

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

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

4

2 回答 2

1

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

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

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 上的任何“捎带”等。

于 2013-01-24T01:24:52.913 回答
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;
}
于 2013-01-24T01:30:05.590 回答