繁体   English   中英

FileReader.ReadAsync 真的是异步的吗?

[英]Is FileReader.ReadAsync truly async?

所以最近我正在通过 C# 阅读 Richter 的书 CLR 它是关于 .NET 框架 4.5 或其他东西,他说FileReader.ReadAsync并不是真正的异步,它实际上只是同步win32 API 的异步包装器。 我不是 .NET 框架开发人员,我使用 .NET 核心。 所以我有几个问题:

  1. 将同步功能与 Task.Run 之类的东西包装在一起这一事实对应用程序扩展有多糟糕?
  2. 上述行为是否已在 .NET 核心中修复? 如果我说FileReader.ReadAsync ,它会异步读取吗?
  3. 如果您可以根据我调用的方法(例如ReadReadAsync确定我希望操作是同步还是异步,那么拥有该FileOptions.Asynchronous有什么意义?
  4. 如果 WinRT 提供而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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM