【问题标题】:Why is the CancelIo function failing?为什么 CancelIo 函数失败?
【发布时间】:2012-05-03 20:48:14
【问题描述】:

我写了下面的代码。我正在调用此方法以使用三个单独的线程写入三个不同的硬盘。 CancelIo 调用之一失败(返回 false)。

我假设磁盘没问题(硬件没问题)。

这怎么可能?

(更换磁盘后,我看到它在另一个磁盘上再次发生。)

  public void foo(byte[] bufferToWrite)
  {
      unsafe
      {

            NativeOverlapped overlapped = new NativeOverlapped()
            {
                  EventHandle = eventHandle,
                  OffsetLow   = ( int )( s       & 0xffffffff ),
                  OffsetHigh  = ( int )( s >> 32 & 0xffffffff )
            };

            GCHandle gch = GCHandle.Alloc( bufferToWrite, GCHandleType.Pinned );
            IntPtr ptr = new IntPtr( ( void* )gch.AddrOfPinnedObject() );

            WriteFile( handle, ptr, length, ref bytesWritten, &overlapped );

            dwResult = WaitForSingleObject( EventHandle, 30000 );
            if(dwResult== TIME_OUT)
            {
                   Debug.Assert( CancelIo ( handle ) );

            }
      }
  }  

【问题讨论】:

  • 这看起来像是个错误:if( bResult == ERROR_SUCCESS == || bResult == ERROR_IO_PENDING )??
  • @ChrisF,我只是在想我自己......
  • 伙计们......这只是拼写错误......让我们保持专注:)
  • @Yanshof - 很可能是这样,但你永远不知道。
  • 你是什么意思我从来不知道?我在运行时(在调试中)看到我得到了 assart

标签: c# .net winapi visual-c++ cancelio


【解决方案1】:

如果没有未完成的 IO,CancelIo 会失败。您的 IO 可能会在 30001 毫秒后完成,就在事件等待以超时结束之后。

无法修复此竞争条件。我知道没有比忽略返回值更好的解决方案了。

【讨论】:

  • 如果 WriteFile 失败,则不会有未完成的 IO,这可能是正在发生的事情。他需要检查 WriteFile 返回码,如果失败则不调用 WaitForSingleObject。
  • ..除非 writeFile 失败并且 (GetLastError Result == ERROR_IO_PENDING),否则不调用 WFSO。
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 2018-09-12
  • 2023-03-26
  • 1970-01-01
  • 2018-02-11
相关资源
最近更新 更多