esa*_*sac 8 c# ienumerable task
我有一个方法,它返回一个IEnumerable<string>当然正在处理的方法yield return <string>;.我希望有多个线程处理这个结果,当然不重复它并且是线程安全的.我怎么做到这一点?
var result = GetFiles(source);
for (int i = 0; i < Environment.ProcessorCount; i++)
{
tasks.Add(Task.Factory.StartNew(() => { ProcessCopy(result); }));
}
Task.WaitAll(tasks.ToArray());
Run Code Online (Sandbox Code Playgroud)
然而,这似乎产生了重复:
C:\Users\esac\Pictures\2000-06\DSC_1834.JPG
C:\Users\esac\Pictures\2000-06\DSC_1835.JPG
C:\Users\esac\Pictures\2000-06\.picasa.ini
C:\Users\esac\Pictures\2000-06\DSC_1834.JPG
C:\Users\esac\Pictures\2000-06\DSC_1835.JPG
C:\Users\esac\Pictures\2000-06\.picasa.ini
C:\Users\esac\Pictures\2000-06\DSC_1834.JPG
C:\Users\esac\Pictures\2000-06\DSC_1835.JPG
C:\Users\esac\Pictures\2000-06\.picasa.ini
C:\Users\esac\Pictures\2000-06\DSC_1834.JPG
C:\Users\esac\Pictures\2000-06\DSC_1835.JPG
Run Code Online (Sandbox Code Playgroud)
您可以使用Parallel.ForEach方法轻松完成此操作.
每次迭代都将在任务管理器中排队.执行所有迭代时,循环将退出.
var result = GetFiles(source);
Parallel.ForEach(result, current => {
ProcessCopy(current);
});
Console.WriteLine("Done");
Run Code Online (Sandbox Code Playgroud)