2012-05-03 71 views
0

我寫下面的代碼。我將這種方法稱爲使用三個獨立線程寫入三個不同的硬盤。其中一個CancelIo調用失敗(返回false)。爲什麼CancelIo函數失敗?

我假設磁盤是好的(硬件很好)。

這怎麼可能?如果沒有優秀的IO

(更改磁盤我看到它在另一個磁盤上再次發生後)。

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)); 

      } 
     } 
    } 
+0

這看起來像一個錯誤:'if(bResult == ERROR_SUCCESS == || bResult == ERROR_IO_PENDING)'?? – hmjd

+0

@ChrisF,只是在想我自己... – hmjd

+0

夥計......它只是拼寫錯誤..讓我們保持焦點:) – Yanshof

回答

2

CancelIo失敗。您的IO可能會在30001毫秒後完成,緊接着事件等待以超時結束。

這種競爭條件無法修復。我知道沒有比忽略返回值更好的解決方案。

+1

如果WriteFile失敗,那麼就不會有未完成的IO,這可能是發生了什麼事情。他需要檢查WriteFile返回碼,如果失敗,不要調用WaitForSingleObject。 –

+0

..不調用WFSO,除非writeFile失敗,並且(GetLastError Result == ERROR_IO_PENDING)。 –