【问题标题】:Can I use synchronous I/O on a FileStream opened for asynchronous?我可以在为异步打开的 FileStream 上使用同步 I/O 吗?
【发布时间】:2018-09-21 09:58:15
【问题描述】:

假设我为异步 I/O(使用 FileOptions.Asynchronous)打开了一个 FileStream,从快速测试看来我可以对其进行正常的同步 I/O,结果与我没有询问就打开它一样用于异步。

这样做有什么隐藏的陷阱吗?我想我需要传入一个特殊标志来指示异步的原因是因为有一些额外的开销。

我想要这样做的原因仅仅是因为代码重用 - 我已经有一个函数可以异步打开我想要调用的文件,但调用代码是同步的。

【问题讨论】:

  • 我认为这是一个 X/Y 问题...您真正想在这里解决什么问题?请具体。你遇到了什么问题?
  • 问题是我有一个为异步 I/O 打开的流,但我想对其进行同步 I/O,我想知道这是否安全
  • 您的保修说明这样做没有问题。就像异步使用它很可能无论如何都同步完成一样。
  • 这取决于您尝试执行的操作,如果它们相互冲突,例如。查看文件然后在文件仍处于打开状态时进行编辑,那么操作系统将限制您。无论操作是否同步,这都更少,更多的是与操作系统限制有关。如果您尝试进行非冲突操作,那么您应该没问题。

标签: c# file-io io


【解决方案1】:

如果您提供FileOptions.Asynchronous - FileStream 将使用窗口重叠 IO。简而言之,这意味着当读写操作完成时,操作系统会通过 IO 完成端口通知应用程序,而不会阻塞应用程序线程以等待该特定操作完成。

当您对此类 FileStream 执行同步操作时 - 仍然使用相同的重叠 IO,然后您的当前线程被阻塞等待它完成,基本上破坏了重叠 IO 的所有好处。

与同步 IO 相比,这种重叠 IO 有一些开销,因此,总的来说,在 FileStreamFileOptions.Asynchronous 上执行同步操作确实有一些开销。但是,如果此开销对您的特定情况很重要,则只能由您自己衡量。

旁注:如果您在 FileStream 上执行异步操作而没有该标志 - 使用常规同步 IO 并且线程池线程基本上等待它完成,使整个事情变得毫无用处(除非您只为比如避免 UI 线程阻塞而不是增加吞吐量)。

简而言之,如果可以的话,打开文件以进行同步或异步访问,然后以这种方式实际访问它。但如果由于某种原因你不能 - 在这两种情况下都会有一些开销,但它仍然可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 2013-07-15
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2016-08-30
    • 2018-04-06
    • 2013-06-19
    相关资源
    最近更新 更多