【问题标题】:Processing Files using ParallelForeach. Is this the best approach使用 ParallelForeach 处理文件。这是最好的方法吗
【发布时间】:2013-01-17 21:42:14
【问题描述】:

只是一些建议 我有 100.000+ xml 文件要处理并移动到另一个系统。

这个概念很简单,我有一个循环:

    public void ProcessFiles()
    {
        IEnumerable<FileInfo> orderedFiles = GetFilesOrdered();

        foreach (FileInfo file in orderedFiles)
        {
            ProcessFile(file);
        }
    }

我一直在阅读有关 Task Parallel 库的信息,但没有那么自信。 不是很粘在线程上。 看来 TPL 为我包装了很多东西。

简单来说就是使用parallel.Foreach的一个例子吗?

任何示例或建议

【问题讨论】:

  • 您好,为了线程安全,最好确保这些文件中的任何一个都不能同时访问。
  • @Joe.wang 谢谢你的意思是加锁吗?如果不能,你能给我一个 sn-p 吗?谢谢你的时间
  • index 变量有什么用?你好像没用过。
  • @Bridge 删除索引抱歉不应该在那里
  • @user231465 别抱歉,只是想知道而已!

标签: c# multithreading task-parallel-library


【解决方案1】:

是的,它可能就像用 Parallel.ForEach 替换 foreach 一样简单。

您必须记住,现在多个线程将同时执行ProcessFile

因此,如果您在该方法中写入任何共享状态,则必须使用同步构造来保护它。

如果您不熟悉多线程,那么您应该在这里阅读一本很棒的介绍性电子书:Albahari

【讨论】:

  • 再想一想:只有当 IO 当前不是瓶颈时,才在此处添加并行性才有意义
  • @NicholasButler 那么你如何避免使用并行库的竞争条件呢?你用锁吗
  • @user231465 这是一个很大的话题。我建议您阅读 Joe Albahari 的电子书。如果要正确编写并发代码,则需要了解其中的所有内容。
  • @NicholasButler 谢谢。我明白了。基本上我们仍然必须使用 TPL 处理锁、死锁等。
  • @user231465 是的,您仍然需要处理并发问题。 PLINQ 和 TPL 使创建和控制线程和任务变得更加容易,但您仍然必须确保您的代码能够处理并发性。
【解决方案2】:

希望对你有所帮助。简单的 sn-p 演示如何并行移动文件。

        List<FileInfo> files = new List<FileInfo>();
        files.Add(new FileInfo("F:\\1.xml"));
        files.Add(new FileInfo("F:\\2.xml"));
        files.Add(new FileInfo("F:\\3.xml"));



        Parallel.ForEach(files, f =>
        {
            f.MoveTo("d:\\test\\" + f.Name); 
        });

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多