2011-02-14 76 views
4

我正在執行掃描所有文件夾名稱的任務,並行地以「xyz」開始。我的意思是如果一個文件夾同時掃描,其他人也應該掃描。我不想一個接一個地掃描。C#中的Parallel.Foreach和並行執行#

爲此我使用了Parallel Foreach。

問題是? 它是否正確?和如何知道它是否並行運行(把任何消息放在哪裏)?

Parallel.ForEach(path, currentPath => 
    { 
    var output = programReader.GetData(currentPath, durReader.dirPattern); 

    foreach (var item in output) 
     { 
     foreach (var project in item.Name) 
      Console.WriteLine(item.serverName + " " + item.serverNumber + " " + fileName); 
     } 
    } 

編輯:

是Parallel.Foreach僅適用於多核系統,也可能單核系統上工作也進行演出並行

+2

由於這是I/O限制,所以並行運行實際上可能會比較慢。確保你計算結果。 –

回答

3

初始 - 如果您問一個問題,請提出問題。 !這是一個很好的跡象,它不是一個問題。

其次,您的方法沒有多大意義。並行將非常平行。好。壞:你仍然只有一張光碟。結果:等待的任務。在硬件支持的程度上將IO操作並行化是沒有意義的。

+0

哦! thanx指點。我做了改變。我懷疑這是'Parallel'會將任務分配給不同的進程。我怎麼能知道每個路徑文件夾並行掃描。我完全困惑。 – PawanS

+0

同樣,處理器的數量是無關緊要的。您的光盤速度不夠快,無法同時處理多個請求。即使是一個10歲的processsor也會太快。除非您有大型SAN或SSD可用,否則光盤IO無法高效地進行對等。 – TomTom

+0

噢...所以你想說,這個Parallel並不適用於一個核心繫統。那麼我應該如何對目錄進行並行掃描? – PawanS

0

您可以Thread.ManagedThreadId值打印到看看哪些線程正在使用。

+0

哦,是的!那是一種方式。讓我試試看。 – PawanS

0

Parallel.ForEach或Parallel.Execute使用處理器的核心。所以如果你的處理器有更多的核心,它們將同樣用於運行這個線程。在這裏,你是m

1

並行擴展分裂負載每核心 - 雖然我不知道他們是否考慮到超線程核心。

但是,添加其他答案引導你在正確的方向:

不要嘗試在平行做到這一點。磁盤一次只能處理一個請求,因此您可能會放慢一切,因爲磁盤隊列可能會變得更大。

如果您正在掃描的位置實際上是存儲分佈式和高度複製的SAN,那麼您可能會獲得更高性能的唯一場景是。