【发布时间】:2017-05-09 03:01:00
【问题描述】:
有没有办法在 Windows 中异步打开文件? CreateFile API 函数只有 FILE_FLAG_OVERLAPPED 允许进一步的异步读写。尽管如此,文件的打开似乎是同步的。鉴于它必须访问文件系统(并可能执行昂贵的 IO 操作),它可能是一个潜在的阻塞器。
这实际上是一个潜在的问题,是否可以在 .NET 中异步打开文件(因为不能等待 FileStream ctor)。但是如果在操作系统中没有办法做到这一点,那么这个问题就毫无意义了。
【问题讨论】:
-
如果有异步调用的方法,你会如何建议CreateFile 报告错误(甚至传回有效句柄)?你问题的第二部分没有任何意义。当然,您始终可以在调用之上实现异步框架调用,这本身并不是异步的。例如,UWP 仅提供异步调用来打开文件,即使它执行严格同步的 API 调用。
-
@IInspectable - 与 Windows 中任何其他重叠操作的工作方式相同。 IE。在重叠结构中,您将传递一个回调函数,该函数将返回一个句柄或错误代码。与此类似:msdn.microsoft.com/en-us/library/windows/desktop/aa364052.aspx Re 第二部分,这有点跑题了。当然,最好有“假”异步 api,它在后台使用线程。尽管如此,除非整个链以这种方式工作,否则它会阻碍异步流的好处。只是我的意见...
-
“尽管如此,除非整个链以这种方式工作,否则它会阻碍异步流的优势。” - 那么,继续,放弃 .NET 并转向 UWP, 一切都是这样工作的。或者使用Parallel Patterns Library,这样您就可以将任何同步调用包装到异步接口中。或 C++'std::async 就此事。归根结底,必须有人启动一个线程,或者使用现有的线程池线程来实现异步。
-
@Elephantik - “与 Windows 中任何其他重叠操作的工作方式相同” - 用于创建/打开文件 (
CreateFile -> ZwOpenFile, ZwCreateFile -> IoCreateFile -> ObOpenObjectByName) 的任何 api 都不接受参数 apc 回调函数或事件。并且因为尚未创建句柄 - 没有绑定到某些 IOCP - 所以没有办法,即使使用低级 api,即使来自内核模式。 -
@IInspectable:
At the end of the day, someone will have to spin up a thread, or use an existing thread pool thread to implement asynchronicity.不。异步不依赖于线程。
标签: .net windows file winapi asynchronous