0

以下のコードを書きました。このメソッドを呼び出して、3つの別々のスレッドを使用して3つの異なるハードディスクに書き込みます。CancelIo呼び出しの1つが失敗しています(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 ) );

            }
      }
  }  
4

1 に答える 1

2

未処理のIOがない場合、CancelIoは失敗します。イベント待機がタイムアウトで終了した直後の30001ms後にIOが完了する場合があります。

この競合状態は修正できません。戻り値を無視するよりも良い解決策はありません。

于 2012-05-03T21:47:30.173 に答える