小查询应该是异步的吗?

时间:2016-09-19 07:39:25

标签: c# asp.net asynchronous

我看到System.IO中的简单文件系统操作不是异步(移动文件,删除文件)。遵循该原则 - 小查询应该是异步的吗?如果是这样,小查询的边界是什么? < 5毫秒? < 50 ms?

1 个答案:

答案 0 :(得分:2)

当异步API可用时,没有理由使用同步调用。棘手的部分是许多操作没有异步API。

System.IO如何运作的基本原理植根于过去很长一段时间的设计决策,当时网络驱动器(更不用说“云存储”)相对稀少,驱动器很小。像“打开文件”这样的操作没有异步API,而其他一些具有异步API的操作并不一定在.NET中可用。

您很少需要考虑异步调用的成本 - 与任何I / O操作相比,它都可以忽略不计。因此,诀窍是考虑不涉及实际I / O的情况 - 例如,当逐字节读取文件时,实际上您花了大部分时间从内存缓冲区读取,使得异步开销很重要。但另一种选择是不使用同步API,它确保缓冲在合理的数据块上进行,而不是单个字节。

没有什么能使异步API本身变慢。例如,Windows中的同步文件API仍然调用异步API - 然后等待结果(标志中存在一些差异,但没有什么重要的)。在桌面Windows世界中没有真正的同步I / O操作,因为关于Windows 2000(IIRC在95年代Windows中的支持有点......比较棘手)。

如果文件系统API是今天设计的,File.Move 当然是异步操作。实际上,在Windows API中,还有两个更现代的变体 - MoveFileExMoveFileWithProgress,它们都是异步的。唯一的问题是.NET不会直接公开它们,所以你需要使用P / Invoke来调用它们。不用说,它们对网络共享非常有用。