Parallel.ForEach

如果你在一个非常大的目录中查找文件,可以使用并行处理来加速搜索。以下是一个示例:

using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        string directoryPath = @"C:\YourDirectory"; // 替换为你的目录
        string searchPattern = "*.txt"; // 查找所有文本文件

        try
        {
            var directories = Directory.GetDirectories(directoryPath, "*", SearchOption.AllDirectories);

            Parallel.ForEach(directories, (dir) =>
            {
                var files = Directory.GetFiles(dir, searchPattern);
                foreach (var file in files)
                {
                    Console.WriteLine(file);
                }
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}

3. 利用文件系统的缓存

确保你的文件系统缓存是启用的,这样在多次访问相同的文件时,可以显著提高访问速度。

4. 使用数据库管理文件

如果你频繁地需要查找和管理大量文件,可以考虑将文件元数据存储在数据库中。这样你可以通过快速的数据库查询来找到文件,而不是直接在文件系统中查找。

Parallel.For 和 Parallel.ForEach 方法支持通过使用取消令牌进行取消。 若要详细了解取消的大致信息,请参阅取消。 在并行循环中,将 CancellationToken 提供给 ParallelOptions 参数中的方法,再将并行调用封闭到 try-catch 块中。下面的示例展示了如何取消调用 Parallel.ForEach。 可以采用相同的方法来取消调用 Parallel.For

namespace CancelParallelLoops
{
    using System;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;

    class Program
    {
        static void Main()
        {
            // 创建一个包含从 0 到 9999999 的整数数组
            int[] nums = Enumerable.Range(0, 10_000_000).ToArray();

            // 创建一个 CancellationTokenSource,用于控制任务的取消
            using CancellationTokenSource cts = new();

            // 配置并行选项,包括取消令牌和最大并行度
            ParallelOptions options = new()
            {
                CancellationToken = cts.Token, // 设置取消令牌
                MaxDegreeOfParallelism = Environment.ProcessorCount // 最大并行处理线程数
            };

            Console.WriteLine("Press any key to start. Press 'c' to cancel.");
            Console.ReadKey();

            // 启动一个任务用于监听用户输入,如果输入 'c' 则取消
            Task.Factory.StartNew(() =>
            {
                // 等待用户按下键盘,如果按下 'c',则调用 Cancel 方法
                if (Console.ReadKey().KeyChar == 'c')
                {
                    cts.Cancel(); // 发送取消请求
                }
                Console.WriteLine("Press any key to exit.");
            });

            try
            {
                // 并行处理每一个数字,计算平方根并输出
                Parallel.ForEach(nums, options, (num) =>
                {
                    // 计算当前数字的平方根
                    double result = Math.Sqrt(num);
                    // 输出计算结果和当前线程 ID
                    Console.WriteLine("{0} on {1}", result, Environment.CurrentManagedThreadId);
                });
            }
            catch (OperationCanceledException e)
            {
                // 捕获任务取消异常并输出相关信息
                Console.WriteLine("Operation was canceled: " + e.Message);
            }
            finally
            {
                // 确保释放 CancellationTokenSource 资源
                cts.Dispose();
            }

            // 等待用户按键以结束程序
            Console.ReadKey();
        }
    }
}

代码结构和注释说明:

  1. Namespace 和 Usings: 定义命名空间并引入必要的命名空间,方便使用相关类和方法。
  2. 主类和入口点: 定义 Program 类和 Main 方法作为程序的入口。
  3. 整数数组的生成: 创建一个包含从 0 到 9,999,999 的整数数组,以供后续计算。
  4. CancellationTokenSource: 创建一个取消令牌源,以允许任务取消。
  5. ParallelOptions 配置: 设置并行处理的选项,包括取消令牌和最大并行度(处理器核心数)。
  6. 用户输入监听: 启动一个后台任务,等待用户输入,以决定是否取消正在进行的操作。
  7. Parallel.ForEach 执行: 在并行循环中处理数组的每个元素,计算平方根并输出结果。
  8. 异常处理: 捕获 OperationCanceledException,以处理任务取消的情况,并输出相关信息。
  9. 资源释放: 在 finally 块中确保释放 CancellationTokenSource 的资源。
  10. 结束程序的等待: 在程序结束前等待用户按键,确保用户能看到输出。

这种结构化的代码便于理解和维护,同时注释详细说明了每个部分的功能。

posted @   多见多闻  阅读(50)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示