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();
}
}
}
代码结构和注释说明:
- Namespace 和 Usings: 定义命名空间并引入必要的命名空间,方便使用相关类和方法。
- 主类和入口点: 定义
Program
类和Main
方法作为程序的入口。 - 整数数组的生成: 创建一个包含从 0 到 9,999,999 的整数数组,以供后续计算。
- CancellationTokenSource: 创建一个取消令牌源,以允许任务取消。
- ParallelOptions 配置: 设置并行处理的选项,包括取消令牌和最大并行度(处理器核心数)。
- 用户输入监听: 启动一个后台任务,等待用户输入,以决定是否取消正在进行的操作。
- Parallel.ForEach 执行: 在并行循环中处理数组的每个元素,计算平方根并输出结果。
- 异常处理: 捕获
OperationCanceledException
,以处理任务取消的情况,并输出相关信息。 - 资源释放: 在
finally
块中确保释放CancellationTokenSource
的资源。 - 结束程序的等待: 在程序结束前等待用户按键,确保用户能看到输出。
这种结构化的代码便于理解和维护,同时注释详细说明了每个部分的功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!