场景:实际开发中对接的第三方接口比较慢导致循环处理时任务堆积堵塞,这个时候需要分赛道并行处理来提一提速
-- 列出指定目录下及所其有子目录及子目录里更深层目录里的文件(需要递归)
public static void TranslationAllFiles(string from, string to, string path)
{
DirectoryInfo dir = new DirectoryInfo(path);
/* 找到该目录下的文件 */
FileInfo[] files = dir.GetFiles();
/* 如果需要限制同时进行的线程数 */
TaskScheduler scheduler = new ConcurrentExclusiveSchedulerPair(TaskScheduler.Current, 20).ConcurrentScheduler;
TaskFactory fac = new TaskFactory(scheduler);
List<Task> tasks = new List<Task>();
foreach (var file in files)
{
if (file.Extension.ToLower() == ".json")
{
tasks.Add(fac.StartNew(() =>
{
TranslationByJsonFile(from, to, file);
}));
}
else if (file.Extension.ToLower() == ".resx")
{
tasks.Add(fac.StartNew(() =>
{
TranslationByResxFile(from, to, file);
}));
}
}
/* 等待所有的任务都处理完再接着往下走 */
Task.WaitAll(tasks.ToArray());
/* 找到该目录下的所有目录再递归 */
DirectoryInfo[] subDir = dir.GetDirectories();
foreach (DirectoryInfo d in subDir)
{
TranslationAllFiles(from, to, d.FullName);
}
}