我有一個EmpIds列表。我需要爲此列表中的每個EmpId執行一些操作。使用AsParallel
void ProcessEmp(EmpId empId)
{
// process the emp
}
而不是在同一時間通過每個店員ID一個循環,可以使用涉及進行AsParallel此操作?基本上我想要並行處理每個emp Id。
我有一個EmpIds列表。我需要爲此列表中的每個EmpId執行一些操作。使用AsParallel
void ProcessEmp(EmpId empId)
{
// process the emp
}
而不是在同一時間通過每個店員ID一個循環,可以使用涉及進行AsParallel此操作?基本上我想要並行處理每個emp Id。
而不是AsParallel
,你可能想Parallel.ForEach
:
Parallel.ForEach(ids, ProcessEmp);
或者,如果你不喜歡的方法組轉換:
Parallel.ForEach(ids, id =>
{
Console.WriteLine("Processing {0}", id);
ProcessEmp(id);
});
謝謝喬恩。我嘗試使用parallel.ForEach。但它沒有提供任何性能改進。程序仍然需要20分鐘才能運行 – RRForUI 2012-02-24 18:42:33
@rohit:不知道它在做什麼,我們無法真正知道有什麼問題。例如,也許你的瓶頸是一些外部資源。 – 2012-02-24 18:43:46
您可以使用他們Parallel.Foreach()
。 http://msdn.microsoft.com/en-us/library/dd537608.aspx
這裏是樣品例如
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
多少個項目你有在列表中? CPU的密集程度是如何處理的?我真的*取決於並行是否更快。你有沒有做過任何時間?這是你的瓶頸嗎? – BrokenGlass 2012-02-24 17:38:36
在哪個列表?我在你的例子中看到一個函數聲明。如果您的列表支持IEnumerable,則可以使用Parallel.Foreach。 – 2012-02-24 17:38:48
@BrokenGlass EmpId列表中有大約80個項目。 Noramal進程需要大約20分鐘來處理這些emp ID。我想知道是否可以做得更快。 – RRForUI 2012-02-24 17:41:56