2

win32メソッド「WriteFile」を使用してC#(バージョン.net 4.0)で作業を行います。メソッドがタスクを終了するまで待機し、「WaitForSingleObject」を使用してそれを行う必要があります。

しかし、メソッド「WriteFile」が失敗する場合があります==>そのため、この場合、「WaitForSingleObject」に30秒のタイムアウトを与えました。

しかし、この 30 秒後、メソッド 'WriteFile' のスコープから外れます => メソッド 'WriteFile' で引数として指定したオブジェクトを GC が実行すると、収集され、これが発生するとクラッシュします!! ! -

ダンプを確認したところ、メモリが破損しているとのことでした。「WriteFile」の行を削除すると、クラッシュは表示されません。

それを解決する方法は?「WriteFile」メソッドの変数をグローバルにすることができず、ローカル変数のままにしておく必要があります。

コード

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

          bResult = WriteFile( handle, ptr, length, ref bytesWritten, &overlapped );
          if( bResult == ERROR_SUCCESS == || bResult == ERROR_IO_PENDING )
          {
                dwResult = WaitForSingleObject( EventHandle, 30000 );
          }
          }
 } 
4

0 に答える 0