【发布时间】:2021-11-03 13:31:15
【问题描述】:
我正在通过迭代扫描网络驱动器中的文件夹(基本上执行 while 循环)。为了加快进程,我需要为每个文件夹使用线程或任务,并在列表中获得具有属性路径、文件名、lastwriteutc、大小的结果.我在下面做了。
string startFolder = @"D:\Development\TempScan";
string startFolder2 = @"D:\RemotePc";
List<string> foldersToScan = new List<string>();
foldersToScan.Add(startFolder);
foldersToScan.Add(startFolder2);
foreach (var folder in foldersToScan)
{
Thread thread = new Thread(() => IterateFolder(findInfoLevel, additionalFlags, folder))
{
Name = "Thread " + folder
};
thread.Start();
Console.WriteLine(thread.Name.ToLower() + " has started");
//thread.Join();
}
// Database operation here
如果我使用thread.Join()方法代码同步,那么只有我可以执行数据库操作,如果我不使用thread.Join(),那么数据库操作将在扫描操作之前被调用。
我也使用了下面的任务,但它也是同步的
Task task1 = Task.Run(() =>
{
foreach (var folder in foldersToScan)
{
IterateFolder(findInfoLevel, additionalFlags, folder);
}
});
task1.Wait();
如何实现一个文件夹一个线程的文件夹异步扫描,一旦我得到结果异步数据库插入?
【问题讨论】:
-
@stuartd 你能提供一些参考或示例吗?
-
查看
Parallel.For或task.WhenAll而不是手动创建线程。但首先要查看faster file enumeration。 -
Task.Run不是同步的。代码在后台执行。Wait()是一个阻塞调用。如果您想同时扫描多个路径,您需要启动多个任务并使用await Task.WhenAll()等待所有任务@ -
@JonasH 我使用 win32 API 来迭代文件夹,因为它比 .net 中提供的常规内置函数快 20 倍
-
不要期望并行运行扫描会有巨大的改进。在并发访问方面,网络驱动器可能会受到网络和磁盘 IO 限制的限制。在全力以赴编码任务之前做一些粗略的测试。
标签: c# multithreading task-parallel-library threadpool bulkinsert