C#中并行计算大文件哈希值:修改后的异步代码是否可行?
问题解答
修改后的async Task<bool>版本确实可以让两个哈希计算并行执行,原因如下:
- 当你调用
Task.Run(() => createHash(firstFile))和Task.Run(() => createHash(secondFile))时,这两个任务会立即被放到线程池的不同线程中启动执行,此时两个哈希计算已经在后台同时运行了。 await fh和await sh只是分别等待这两个任务完成,不会影响它们的并行执行顺序——哪怕先await第一个任务,第二个任务也已经在后台跑了,不会等第一个完成才开始。
对比最初的版本:
- 最初用
fh.Result的写法也能实现并行,但.Result会阻塞当前线程直到任务完成;而async/await版本会释放当前线程(比如UI线程或者Web请求线程)去处理其他工作,直到任务完成后再继续执行后续代码,资源利用率更高,尤其是在需要响应性的场景下。
额外优化建议
- 用
Task.WhenAll简化等待逻辑,代码更整洁:
private async Task<bool> checkEquality(FileInfo firstFile, FileInfo secondFile) { Task<byte[]> fh = Task.Run(() => createHash(firstFile)); Task<byte[]> sh = Task.Run(() => createHash(secondFile)); var (firstHash, secondHash) = await Task.WhenAll(fh, sh); return firstHash.SequenceEqual(secondHash); }
- 哈希对比不用自己写循环,直接用
Enumerable.SequenceEqual(需要引入System.Linq),逻辑更可靠。 - 如果你的
createHash方法里是通过同步IO读取文件(比如File.ReadAllBytes),建议改成异步IO方式(比如用FileStream的ReadAsync方法),这样可以避免线程池线程被IO等待占用,进一步提升效率。
内容的提问来源于stack exchange,提问作者Marc Matthäus
相关产品推荐
相关产品推荐

