.NET和.NET Core中的System.IO.File
具有一系列Read...Async()
方法,所有方法均返回Task<byte[]>
或Task<string>
(Task<T>
与Java的Future<T>
等效于.NET)。
这看起来基本上等效于AsynchronousFileChannel
API(它们使用CompletionHandler
或返回Future
),但有一个主要区别。
AsynchronousFileChannel
使用托管后台线程执行异步I/O(该线程可以由默认线程池(sun.nio.ch.ThreadPool
)提供,也可以由 channel 创建期间明确指定的ExecutorService
提供)。 FileStream
实现将 FileOptions.Asynchronous
标志传递给底层操作系统(另请参见Synchronous and Asynchronous I/O),不产生任何托管后台线程,而是使用所谓的Overlapped I/O。 问题:
sun.nio.ch.WindowsAsynchronousFileChannelImpl
恰好是重叠I/O之上的抽象层。 java.nio.channels.SelectableChannel
实现?如果没有,技术限制是什么? 最佳答案
这是不可能的。整个IO API必须重新实现。 NIO表示非阻塞I/O,它与异步I/O不同。非阻塞是在JAVA中实现的,长话短说,这意味着OS无法通知运行时操作已完成。 Isned Java使用select()
或poll()
系统调用来检查数据是否可用。
我可以谈谈,但乱七八糟的图片值得100个字:
这就是为什么在JAVA中需要单独的线程来不断调用check,check,check,check .....
我不知道.NET平台,但是如果您发布的内容正确,则它使用异步I/O,所以最后一列。但是我不相信来自微软的任何东西。
希望它能回答您的问题。另外,我在这里还有其他阅读 Material :
https://stackoverflow.com/a/2625565/8951886