[英]Is FileReader.ReadAsync truly async?
所以最近我正在通过 C# 阅读 Richter 的书 CLR 。 它是关于 .NET 框架 4.5 或其他东西,他说FileReader.ReadAsync
并不是真正的异步,它实际上只是同步win32
API 的异步包装器。 我不是 .NET 框架开发人员,我使用 .NET 核心。 所以我有几个问题:
FileReader.ReadAsync
,它会异步读取吗?Read
或ReadAsync
确定我希望操作是同步还是异步,那么拥有该FileOptions.Asynchronous
有什么意义?win32
不提供,为什么不使用 WinRT 进行异步读取/打开? FileStream.ReadAsync
总是从应用程序级别视图中异步读取文件(此时调用没有被阻塞,只是将控制权返回给用户代码)。
但这是真正的还是模拟的异步 I/O - 取决于FileOptions.Asynchronous
选项:来自Using Async for File Access (C#)
此选项导致异步 I/O 在操作系统级别发生。 通过使用此选项,您可以避免在许多情况下阻塞 ThreadPool 线程
这是答案
拥有那个 FileOptions.Asynchronous 有什么意义
并从书中
当您创建 FileStream object 时,您可以通过FileOptions.Asynchronous标志(相当于调用 Win32 CreateFile function 并将FILE_FLAG_OVERLAPPED标志传递给它)指定是使用同步操作还是异步操作进行通信。 如果不指定此标志,Windows 将同步对文件执行所有操作。 当然,您仍然可以调用 FileStream 的ReadAsync方法,并且对于您的应用程序,它看起来好像正在异步执行操作,但在内部,FileStream class 使用另一个线程来模拟异步行为; 使用这个线程是浪费的并且会损害性能。 另一方面,您可以通过指定FileOptions.Asynchronous标志来创建 FileStream object。 然后可以调用 FileStream 的 Read 方法进行同步操作。 在内部,FileStream class 通过启动异步操作来模拟此行为,然后立即使调用线程进入睡眠状态,直到操作完成。 这也是低效的,但它并不像使用没有FileOptions.Asynchronous标志的 FileStream 调用 ReadAsync 那样低效
所以这里声明 FileStream class 仅在您未指定FileOptions.Asynchronous
标志的情况下才使用另一个线程来模拟异步行为。
如果 WinRT 提供而 win32 不提供,为什么不使用 WinRT 进行异步读取/打开?
winRT 内部无论如何调用 win32(或本机)api。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.