首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CancelIo函数失败?

为什么CancelIo函数失败?
EN

Stack Overflow用户
提问于 2012-05-04 04:48:15
回答 1查看 443关注 0票数 0

我写了下面的代码。我调用这个方法来使用三个不同的线程写入三个不同的硬盘。其中一个CancelIo调用失败(返回false)。

我假设磁盘是正常的(硬件是正常的)。

这怎么可能呢?

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

代码语言:javascript
复制
  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 ) );

            }
      }
  }  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-04 05:47:30

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10439100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档