代码之家  ›  专栏  ›  技术社区  ›  drem1lin

为什么异步WriteFileEx的行为类似于同步?

  •  -1
  • drem1lin  · 技术社区  · 2 年前

    我正试图写一些东西来取代同步 WriteFile + CancelSynchronousIo 将Windows XP支持添加到程序中。我选择了异步 WriteFileEx + CancelIo ,那就更难满足了。我写了一个小程序来测试行为( full code ).

    经过一些测试,我不明白发生了什么:

    2024-04-24 17:22:26: WriteFile start
    2024-04-24 17:22:26: Starting concurrent thread.
    2024-04-24 17:22:26: Exiting concurrent thread.
    2024-04-24 17:22:26: WriteFile result 1, LastError() = 0
    2024-04-24 17:22:26: Wait start
    2024-04-24 17:22:26: Second event was signaled.
    2024-04-24 17:22:51: Cancel result 1, LastError() = 0
    2024-04-24 17:22:51: Wait end
    

    它需要25秒的写入时间,并且当我设置它时不会对取消事件做出反应。为什么?或者有时整个事件设置得更快( WaitForMultipleObject 返回代码),并且通常没有关于超时的消息,但它应该每100毫秒出现一次。

    我的代码打开一个文件并启动异步写入操作:

    const HANDLE hFile = CreateFile(path.c_str(),  GENERIC_WRITE, FILE_SHARE_READ, NULL,
    CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
    const BOOL result = ::WriteFileEx(m_file.get(), buffer, bytesToWrite, &m_ov, FileIOCompletion);
    

    之后,它开始等待完整的事件:

    dwEvent = WaitForMultipleObjectsEx(1, waitObjects.data(), FALSE, 1000, FALSE);
    

    我用过 FileIOCompletion 从设置完整事件 OVERLAPPED (表现得像 蓝色代码 ).

    有时我会看到超时消息,我认为它的行为与预期的一样,但它是如此的不可预测,以至于我无法理解。

    这个代码正确与否?

    0 回复  |  直到 2 年前