2012-05-03 28 views
0

私は以下のコードを書いています。私は3つの別々のスレッドを使用して3つの異なるハードディスクに書き込むためにこのメソッドを呼び出しています。 CancelIo呼び出しの1つが失敗しています(falseを返します)。CancelIo関数が失敗するのはなぜですか?

私は、ディスクが(ハードウェアで結構です)OKであることを前提としています。

これはどのようにすることができますか?

(ディスクを変更した後、私はそれが別のディスクに再び起こって参照してください。)未解決の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

これは間違いのようになります。 ''場合(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を呼び出すことはありません。 –

関連する問題