2010-10-31 60 views
0

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

目前我有基础应用程序通过参数传递配置文件的位置,所以它可以根据应用程序需要使用它进行调整。它还通过一项交易进行进口,所有交易都正常。

我担心在同一个盒子上运行同一个.exe文件的20个实例每小时可能会导致CPU出现最大值?

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

+0

CPU没有可以吹的保险丝。同时运行20个进程不是问题。无论如何,这可能都是完全I/O绑定的。 – 2010-10-31 11:50:17

+0

不,但将CPU处理推至100%可能会导致运行在同一服务器上的其他进程出现问题。这是在运行IIS的服务器上运行的,所以影响可能是IIS运行速度较慢。 – StuffandBlah 2010-10-31 14:39:42

回答

2

每个可执行文件都将运行在它自己的进程中,因此它有自己的线程。根据每个任务的处理器密集程度,CPU可能会最大化,但这不一定是需要关注的问题。如果您担心并发负载,那么最好的办法可能是错开进程的时间安排,以便让它们的最小数量同时运行。

+0

这并不完全回答这个问题。这并不能保证只有一个实例正在运行。 – 2010-10-31 10:14:15

+0

我没有看到任何地方提到的要求 - 这个问题似乎被要求假设的立场,即将运行的exe的多个实例 - 或者我错过了什么? – 2010-10-31 10:17:40

+0

对不起,我应该更清楚一点。我确实需要多个实例,我不想让服务器停下来,因为我有太多的进程在运行。 – StuffandBlah 2010-10-31 10:23:58

0

不,这不是一个线程问题。

只需在应用程序开始时创建一个系统范围为的名称为Mutex。创建该互斥锁时,请查看它是否已经存在。如果是这样,这意味着应用程序还有另一个实例在运行。在这一点上,你可以给用户一个消息(通过控制台或消息框)说另一个实例已经在运行,那么你可以终止应用程序。

+0

这只会强制执行一个此类流程,但如果处理器不是此处的瓶颈,那么这会降低性能。 – Dialecticus 2010-10-31 10:24:31

+0

任何使用互斥锁或锁都会降低性能。问题是要求停止多个实例的方法,这是一个众所周知且常用的方法。 – 2010-11-02 04:24:19

2

为什么不制作一个可以处理多种配置的单个实例?看起来更容易维护和控制。

+0

单个实例的问题是该过程可能会运行几分钟。如果有20个不同的数据库需要导入,那么您需要对每个数据库事务进行排队(反正是这样做的一种方式)。 另一种方法是将控制台应用程序转换为Windows服务,并使其扫描CSV文件而不是预定运行。在CSV可用的时候,它可以启动导入过程,这可能是线程化的。 – StuffandBlah 2010-10-31 22:16:24

0

我意识到这个线程是非常古老的,但我在我的项目上遇到了同样的问题。我建议使用MSMQ按顺序处理作业。