2010-10-31 65 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按順序處理作業。