通过多线程扫描文件夹

Scanning folders via multiple threading

我正在通过迭代扫描网络驱动器中的文件夹(基本上做 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(); 

如何实现每个文件夹一个线程异步扫描文件夹,一旦得到结果异步数据库插入?

var threads = new List<Thread>();

foreach (var folder in foldersToScan)
{
    var thread = new Thread(() => IterateFolder(findInfoLevel, additionalFlags, folder))
    {
        Name = "Thread " + folder
    };

    thread.Start();
    Console.WriteLine(thread.Name.ToLower() + " has started");
    threads.Add(thread);
}

foreach(var thread in threads)
{
    thread.Join();
}

这样代码 waits/blocks 直到所有线程都完成。您 could/should 使它更健壮:错误处理、超时或切换到任务。

您也可以使用 Linq:

foldersToScan.AsParallel().Where( f => IterateFolder( findInfoLevel, additionalFlags, f ) );

Here 是如何使用 Linq 中的 AsParallel() 的更多示例。

要使其异步,您可以将它放在一个单独的 BackgroundWorker 或线程中。