2012-02-24 55 views
3

我有一個EmpIds列表。我需要爲此列表中的每個EmpId執行一些操作。使用AsParallel

void ProcessEmp(EmpId empId) 
{ 
    // process the emp 
} 

而不是在同一時間通過每個店員ID一個循環,可以使用涉及進行AsParallel此操作?基本上我想要並行處理每個emp Id。

+3

多少個項目你有在列表中? CPU的密集程度是如何處理的?我真的*取決於並行是否更快。你有沒有做過任何時間?這是你的瓶頸嗎? – BrokenGlass 2012-02-24 17:38:36

+2

在哪個列表?我在你的例子中看到一個函數聲明。如果您的列表支持IEnumerable,則可以使用Parallel.Foreach。 – 2012-02-24 17:38:48

+1

@BrokenGlass EmpId列表中有大約80個項目。 Noramal進程需要大約20分鐘來處理這些emp ID。我想知道是否可以做得更快。 – RRForUI 2012-02-24 17:41:56

回答

5

而不是AsParallel,你可能想Parallel.ForEach

Parallel.ForEach(ids, ProcessEmp); 

或者,如果你不喜歡的方法組轉換:

Parallel.ForEach(ids, id => 
{ 
    Console.WriteLine("Processing {0}", id); 
    ProcessEmp(id); 
}); 
+0

謝謝喬恩。我嘗試使用parallel.ForEach。但它沒有提供任何性能改進。程序仍然需要20分鐘才能運行 – RRForUI 2012-02-24 18:42:33

+0

@rohit:不知道它在做什麼,我們無法真正知道有什麼問題。例如,也許你的瓶頸是一些外部資源。 – 2012-02-24 18:43:46

0

這裏是樣品例如

string[] files = System.IO.Directory.GetFiles(@"C:\Users\Public\Pictures\Sample Pictures", "*.jpg"); 
string newDir = @"C:\Users\Public\Pictures\Sample Pictures\Modified"; 
System.IO.Directory.CreateDirectory(newDir); 

// Method signature: Parallel.ForEach(IEnumerable<TSource> source, Action<TSource> body) 
Parallel.ForEach(files, currentFile => 
{ 
    // The more computational work you do here, the greater 
    // the speedup compared to a sequential foreach loop. 
    string filename = System.IO.Path.GetFileName(currentFile); 
    System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(currentFile); 

    bitmap.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); 
    bitmap.Save(System.IO.Path.Combine(newDir, filename)); 

    // Peek behind the scenes to see how work is parallelized. 
    // But be aware: Thread contention for the Console slows down parallel loops!!! 
    Console.WriteLine("Processing {0} on thread {1}", filename, 
    Thread.CurrentThread.ManagedThreadId); 

    } //close lambda expression 
); //close method invocation 
相關問題