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