2012-05-03 2 views
0

아래 코드를 작성했습니다. 이 메서드를 호출하여 3 개의 개별 스레드를 사용하여 3 개의 다른 하드 디스크에 기록합니다. 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가 30001ms 후에 완료 될 수 있습니다.

이 경쟁 조건은 수정할 수 없습니다. 나는 반환 값을 무시하는 것보다 더 나은 해결책을 안다.

+1

그리고 WriteFile이 실패한 경우 처리되지 않은 IO는 없을 것입니다. 그는 WriteFile 반환 코드를 확인하고 실패 할 경우 WaitForSingleObject를 호출하지 않아야합니다. –

+0

.. writeFile이 실패하지 않고 (GetLastError Result == ERROR_IO_PENDING) WFSO를 호출하지 않습니다. –

관련 문제