【问题标题】:C# .NET Newbie Help...Best PracticesC# .NET 新手帮助...最佳实践
【发布时间】:2009-09-13 00:08:52
【问题描述】:

我需要一些关于如何执行我需要执行的特定任务的指导...

我有一个数据库表,其中包含用户对 Excel 电子表格的请求。

在该表中有一个状态列,指示请求所在的步骤。

我需要编写某种服务来持续检查该表的状态列。

当它找到包含它正在寻找的状态的记录时,它应该从记录中提取数据并调用另一个创建 Excel 电子表格的应用程序。

(注意:我编写了一个程序,其中包含一个创建 excel 电子表格并将其保存到本地硬盘驱动器的类。所有这些都将托管在同一台服务器上)

提前致谢!

【问题讨论】:

  • 那么您到底想问什么?

标签: c# web-applications service console


【解决方案1】:

您将希望创建一个 Windows 服务或一个运行您的检查代码设置为计划任务的进程。

我更喜欢windows服务,因为它们是安装好的,总是在启动时启动并在一致的环境中运行。计划任务取决于未被触及的任务,以及未被移动的可执行文件。

Windows 服务/计划任务的主要部分将是计时器。可能每五分钟您需要检查一次数据库表,或多或少的时间取决于您需要的频率。

Here 是一个不错的入门资源。

【讨论】:

  • 感谢您的意见...我将如何调用实际创建电子表格的应用程序?如何配置该应用程序以允许从 Windows 服务调用它并确保它一直运行?我应该将我的类编译成 dll 并将其作为参考添加到 Windows 服务应用程序中吗?
  • 您生成电子表格的代码将通过 Windows 服务完成。该服务将启动,检查数据库,然后调用您的电子表格代码。
【解决方案2】:

如果我是你,我会采取双重方法。

我会将我所有的业务“逻辑”放入 C# 库(比如 widget.core.dll)中。

然后,在您的服务应用程序中,只需启动和停止服务(即不超过 VS 生成的标准样板),并直接调用您的 core.dll。

还要编写一个控制台应用程序,如果需要,它会接受一些输入参数,并让这个调用与您的 core.dll 中的方法完全相同作为您的服务。同样,这个控制台应用程序应该只有勉强足够的代码来处理参数并适当地调用核心库。然后可以手动调用此控制台应用程序,也可以将其作为计划任务调用。

通过将核心库从您的服务或控制台实现中分离出来,您可以更轻松地测试您的应用程序,因为所有准确的流程逻辑都应该在 core.dll 中并且可以从单元测试、测试代码中调用或控制台应用程序。

只需很少的额外开销,您就可以让用户灵活地将应用程序用作服务或计划任务(取决于他们的偏好、环境等)。

service.exe --
             |
             --> core.dll
             |
console.exe--

【讨论】:

  • Jayden 感谢您的意见...我将如何调用实际创建电子表格的应用程序?如何配置该应用程序以允许从 Windows 服务调用它并确保它一直运行?我应该将我的类编译成 dll 并将其作为参考添加到 Windows 服务应用程序中吗?
【解决方案3】:

参考您的帖子:

你可以做几件事:

  1. 你可以按照你的建议去做,有一个程序(一个 Windows 服务听起来很合适)定期查询你的表(听起来像 select * from tableName where field = something)然后要么 a: 只调用必要的应用中的方法,在此程序中作为 dll 引用。

  2. 在您已经编写的程序/exe中包括对表的检查,只需通过Windows计划任务界面进行计划即可。

edit> 我认为 2 可能是最好的。为此,编写一个 Windows 服务是多余的,这取决于检查发生的频率,并且编写所有代码来创建/管理/重新启动/诸如此类的 Windows 服务,虽然有教育意义,但却是浪费精力。

【讨论】:

    【解决方案4】:

    针对您在 cmets 中的其他问题:

    “我将如何调用实际创建电子表格的应用程序?”

    我会在 core.dll 中包含创建电子表格的“应用程序”(除非您有充分的理由,否则我认为库越少越好 - 因为要跟踪的东西越少)。

    您需要在 DLL 中包含一些公共方法,供您的服务或命令行应用使用。

    很可能是调用服务可以使用的 System.Threading.Timer() 对象的方法。创建电子表格的方法。

    【讨论】:

      【解决方案5】:

      如果我理解您的问题,那么您需要编写一个循环来定期检查相关请求的状态列值。在伪代码中:

      while (true)
           for request r in requests
                 <check status column for r, take action as necessary>
           end for
           sleep (some interval)
      end while
      

      【讨论】:

      • 做到了,我正要提你该睡觉了。
      • 机器重启后会发生什么?
      • FWIW。如果编写 Windows 服务,则不应使用无限循环 - 它会占用过多的 CPU。相反,使用 System.Threading.Timer 触发事件。
      • @Ty 和@Rick:是的,我只是想了解问题的核心。我认为“如何编写 Windows 服务?”应该是另一个问题。 @ChaosPandion:对不起,我“粗心大意”地做出了过早的反应。
      • 为什么要使用 Windows 服务?如果已经编写了大部分工作......将 db 调用放入现有应用程序并将其作为 Windows 计划任务。不需要额外的资源(或服务)。
      猜你喜欢
      • 2010-12-14
      • 1970-01-01
      • 2015-12-28
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多