0

在寻找了几天的明确答案后,我决定自己在这里问。

在我的公司,我的任务是制作一个用于气体和火灾检测的 Web 应用程序。它通过 modbus tcp/ip 与 modbus 库进行对话。这种连接工作得非常好,它每秒读取大约 1 次(尽管我可以很容易地调整它)。

我对asp.net mvc模型中的AsynControllers和async-await任务有很多关注。问题是我必须让这个工作不停。因此,当我的应用程序第一次启动时(打算永远不会关闭它,因为它将是一个控制室类型的应用程序),我的应用程序需要开始阅读并继续阅读,同时将此信息放入数据库中,所以我可以将此数据库用于应用程序的其余部分。由于它是火灾检测,因此此更新需要始终并且几乎立即起作用。

我正在考虑在 global.aspx 中调用它,以便它在启动时运行。但是当然,当我调用此方法时,它只会阻止我的完整应用程序。我怎样才能使这项工作?

任何帮助将不胜感激。

编辑:

它似乎可以添加:Task.Factory.StartNew(() => { ModbusDB.Main(); });

到 global.aspx!

4

1 回答 1

1

Web 应用程序不适用于这种“永远在线”的模型。您实际上在谈论的是两个应用程序(可以在同一 Web 服务器上运行):

  1. 一个 Windows 服务(或计划的控制台应用程序,无论您想要什么),它执行与外部系统交互和更新应用程序数据库的后台工作。这是“永远在线”的部分。它轮询外部系统,从中获取所需的数据,更新应用程序数据库。相反,它可以轮询应用程序数据库,从中获取需要的数据,更新外部系统。基本上,它完成了正在进行的背景工作。
  2. 处理与用户交互的 Web 应用程序。这并不是严格意义上的“永远在线”。Web 应用程序旨在接收请求并返回响应。在那次互动之后,它基本上完成了。只是等待其他请求。所以这个应用程序只会与应用程序数据库交互,并向用户提供他们需要的界面。从用户的角度来看,这个应用程序将他们连接到那个外部系统。但从技术角度来看,它只是一个连接到简单数据库的简单 Web 应用程序,其他东西处理与外部系统的交互。

这提供了将您的关注点分成不同的模块的额外好处。如果您需要构建另一个应用程序来与该外部系统交互(可能是人们工作站上安装了某种系统托盘的监控服务),那么该应用程序需要做的就是与数据库交互,而不是与外部系统交互。

相反,如果外部系统发生变化,那么您只需更改该后台服务,而不是用户用来与之交互的应用程序。

于 2013-04-03T12:40:22.843 回答