2011 年 5 月 20 日上午 12:49 更新:对于我的应用程序,foreach 仍然比并行解决方案快 25%。并且不要将收集计数用于最大并行度,使用更接近机器上核心数量的东西。
=
我有一个 IO 绑定任务,我想并行运行。我想对文件夹中的每个文件应用相同的操作。在内部,该操作会产生一个 Dispatcher.Invoke,它将计算的文件信息添加到 UI 线程上的集合中。所以,从某种意义上说,工作结果是方法调用的副作用,而不是方法调用直接返回的值。
这是我要并行运行的核心循环
foreach (ShellObject sf in sfcoll)
ProcessShellObject(sf, curExeName);
这个循环的上下文在这里:
var curExeName = Path.GetFileName(Assembly.GetEntryAssembly().Location);
using (ShellFileSystemFolder sfcoll = ShellFileSystemFolder.FromFolderPath(_rootPath))
{
//This works, but is not parallel.
foreach (ShellObject sf in sfcoll)
ProcessShellObject(sf, curExeName);
//This doesn't work.
//My attempt at PLINQ. This code never calls method ProcessShellObject.
var query = from sf in sfcoll.AsParallel().WithDegreeOfParallelism(sfcoll.Count())
let p = ProcessShellObject(sf, curExeName)
select p;
}
private String ProcessShellObject(ShellObject sf, string curExeName)
{
String unusedReturnValueName = sf.ParsingName
try
{
DesktopItem di = new DesktopItem(sf);
//Up date DesktopItem stuff
di.PropertyChanged += new PropertyChangedEventHandler(DesktopItem_PropertyChanged);
ControlWindowHelper.MainWindow.Dispatcher.Invoke(
(Action)(() => _desktopItemCollection.Add(di)));
}
catch (Exception ex)
{
}
return unusedReturnValueName ;
}
谢谢你的帮助!
+汤姆