0. 前言
不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题:
- 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录
- 因为数据是用的字典保存的,所以会消耗大量的内存空间
- 不能多次查询
现在我们就针对这些问题,让我们的小工具实用起来。
1. 分析与实现
在动手之前,我们先分析一下问题。在实际开发之前,无论是接到什么需求都要先仔细分析一下,确定好方案再动手方为开发的正道。嗯,没毛病。因为开发过程中跟产品对线、跟客户对线要占整个项目的一半左右时间。好了,不废话了。继续:
遍历文件目录的时间过长,那么我们是不是可以用异步并发去遍历呢?
数据用字典保存会消耗内存空间,那么我们是不是可以用其他的方式保存呢?
不能多次查询,是不是可以使用循环,然后设置一个退出条件?
1.1 C#的异步/并发实现
在C#里,异步和并发的实现是依据线程、任务来实现的。在之前《C# 基础知识系列- 12 任务和多线程》里大概介绍了一下线程和任务,我们知道线程本身是没法返回数据的,它与主线程进行数据交互的过程十分需要注意线程安全。而任务可以返回数据,不需要像线程一样小心翼翼地与主线程进行数据交互。任务有一个优点,它比线程更轻量,所以在当前环境下我们可以试试任务。
当然,线程也有优点,那就是线程的运行环境相对更封闭一点,它能完成一个长的大型运算。
那么继续上一篇的内容,先引用 :
using System.Threading.Tasks;
先提取一组根据可枚举目录集合创建任务组并取得结果的方法:
public static Dictionary<string,List<string>> OverDirectories(IEnumerable<DirectoryInfo> directories)
{
var tasks = directories.Select(dir => Task.Run(()=>OverDirectories(di