【问题标题】:Building C# console app for multiple instances为多个实例构建 C# 控制台应用程序
【发布时间】:2011-05-03 00:52:59
【问题描述】:

我正在构建一个将数据导入数据库的控制台应用程序。这将根据存在的输入 CSV 文件每小时运行一次。该应用程序还需要重新用于同一服务器上的其他数据库导入,例如同一个 .exe 文件最多可以有 20 个实例,每个实例都有自己独立的配置。

目前我有一个基本应用程序,它通过 args 传递配置文件的位置,因此可以根据需要使用它的应用程序进行调整。它还通过事务进行导入,一切正常。

我担心每小时在同一个机器上运行 20 个同一个 .exe 文件的实例可能会导致 CPU 耗尽?

我能做些什么来解决这个问题?线程有帮助吗?

【问题讨论】:

  • CPU 没有可以熔断的保险丝。同时运行 20 个进程不是问题。无论如何,这可能都是完全 I/O 绑定的。
  • 否,但将 CPU 处理速度提高到 100% 可能会导致同一服务器上运行的其他进程出现问题。这是在运行 IIS 的服务器上运行的,所以影响可能是 IIS 运行速度较慢。

标签: c# console-application


【解决方案1】:

我意识到这个线程已经很老了,但我的项目也遇到了同样的问题。我建议使用 MSMQ 顺序处理作业。

【讨论】:

    【解决方案2】:

    为什么不创建一个可以处理多个配置的实例?似乎更容易维护和控制。

    【讨论】:

    • 单个实例的问题是进程可能会运行几分钟。如果有 20 个不同的数据库需要导入,那么实际上您需要对每个数据库事务进行排队(无论如何这是一种方法)。另一个选择是我将控制台应用程序转换为 Windows 服务并使其扫描 CSV 文件而不是计划运行。在 CSV 可用时,它可以启动导入过程,该过程可以被线程化。
    【解决方案3】:

    不,这不是线程问题。

    只需在应用程序开始时创建一个系统范围的命名 Mutex。创建该互斥体时,查看它是否已经存在。如果是这样,则意味着您的应用程序的另一个实例正在运行。此时您可以给用户一条消息(通过控制台或消息框)说另一个实例已经在运行,然后您可以终止应用程序。

    【讨论】:

    • 这只会强制一个这样的进程,但如果处理器不是这里的瓶颈,那么这会降低性能。
    • 任何互斥锁或锁的使用都会降低性能。问题是寻求一种停止多个实例的方法,这是一种众所周知且经常使用的方法。
    【解决方案4】:

    每个可执行文件都将在它自己的进程中运行,因此,使用它自己的线程。根据每个任务的处理器密集程度,CPU 可能会最大化,但这并不一定要担心。如果您担心并发负载,那么最好的方法可能是错开进程的调度,以使同时运行的进程数量最少。

    【讨论】:

    • 这并不能完全回答这个问题。这并不能保证只有一个实例在运行。
    • 我没有看到任何地方提到过这个要求——这个问题似乎是从假设的角度提出的,即会有多个 exe 实例运行——或者我错过了什么?
    • 对不起,我应该把这个说得更清楚一点。我确实想要多个实例,我只是不希望服务器因为运行的进程太多而停止。
    • 我同意@AdamRaplh。进行一些测试以了解每个实例将占用多少 CPU 和内存。然后错开开始时间或升级您的服务器,或优化您的代码,或三者兼而有之。
    • 感谢您的回复。我将检查 CPU 处理器和内存使用情况,并错开开始时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多