如何以编程方式监视长时间运行的程序


11

我现在得到的可以用这个伪代码来总结:

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

该程序只是作为预定任务在我们的服务器上设置的。我们拥有该程序,并且可以使用它来做我们想做的事情。我的问题来自有关自动监视检查的博客(我没有可用的链接)。

这样一来,我想到:我该如何修改程序,以便启动另一个“监视”程序?还是应该将其从控制台程序更改为隐藏的WPF程序?

总体而言,我希望能够仅在计算机上运行一个程序,以通过网络检查程序的进度,因此,我不必RDP进入服务器即可检查其状态(但它不会成为世界末日)。

总的来说,我想我想看到一个类似以下内容的窗口:到目前为止,处理y的x,正在处理以下项目。在表格中列出项目,并说“正在上传”或“等待响应”。也许如果我发疯了,我还可以处理一系列失败的项目(但这只是多余的)。

我的想法一直放在事件上,但是我无法弄清楚如何运行可以订阅和退订正在运行的程序的程序。这有可能吗?


您要监视(持续10分钟)上载/响应操作中的进度,还是想知道在“ Parallel.ForEach”循环中进行了多少次上载?
布朗

@DocBrown参见编辑。(最后两段)
罗伯特·斯奈德

1
在我看来,您想要的可能是一个简单的UDP接收程序。您可以在网络上丢弃状态数据包,如果没有接收到的状态数据包,则不会造成任何危害。
罗伯特·哈维

Answers:


7

您需要的是一种在程序之间进行通信的方法,该方法无需将它们彼此绑定在一起。有多种方法可以执行此操作,您可以将任务写入文件,并且必须监视从文件中读取的内容,通过WCF使任务可用,以便监视器可以“轮询”更改,使用网络...

为避免重蹈覆辙,请查看log4net日志记录目标。如果要实现类似的方法,则可能会使用log4net并登录到UDP或Telnet,并在另一端连接监视器。log4net会为您处理所有事情,包括在没有活动的监视器的情况下不引发异常。


我认为我很想回答这个问题,因为我们已经很好地使用过log4net了。我不知道log4net可以做到这一点!谢谢您
罗伯特·斯奈德

9

从您的评论中,我看到您有一个可用的客户端/服务器数据库,并且您的上载器已经具有连接和写访问权限?然后,可能最容易的是向数据库中添加“监视”或“状态”表,然后让您的上传者在此处报告其进度(在此记录每个“有趣”的步骤,可能是上面列出的5个步骤)。

要查看状态,请使用GUI创建第二个程序,该程序将连接到数据库并显示状态(例如,以1分钟为间隔进行轮询)。如果可以从本地桌面连接到数据库,则可以在本地桌面上运行该程序。

当然,当写入状态表干扰数据库事务时,可以使用单独的连接。您也可以使用诸如MSQM之类的消息队列机制,但这对于您的简单情况而言可能是一个过大的解决方案。


+1这是保持其简单性并且不使不应过于复杂的事物变得过于复杂的最佳方法。
Thomas Stringer

3

仅以@JDT的答案为基础,执行此操作的常用方法是将消息写入消息队列。每当您的应用程序中发生重要事件时,它将编写一条消息并将其发送到消息队列。通常,消息的格式是XML或类似格式。是队列编写器。

监视应用程序读取(队列读取器)队列,并选择消息并通过保存它们并分析消息与先前的消息或条件进行比较来处理它们。如果满足条件,则监视应用程序将发出警报,表明潜在的问题。

这使您的应用程序不再监视自身,因为它只是发出消息。监视应用程序将根据当前消息确定何时发生了好坏。之所以使用队列,是因为它们提供了一种存储消息而不会丢失的好方法。

如果您的应用程序正在运行多个实例,则您希望集中化消息传递。如果只有1个实例,则使用Windows事件日志或文件之类的其他存储就足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.