为什么CancelIo函数失败?

时间:2012-05-03 20:48:15

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

我写了下面的代码。我正在调用此方法使用三个单独的线程写入三个不同的硬盘。其中一个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 ) );

            }
      }
  }  

1 个答案:

答案 0 :(得分:2)

如果没有未完成的IO,则取消失败。您的IO可能会在30001ms后完成,就在事件等待超时结束后。

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