2

我使用 win32 方法“WriteFile”在 C#(版本 .net 4.0)中做一些工作,我需要等到该方法完成任务并使用“WaitForSingleObject”来完成。

但在某些情况下,方法“WriteFile”失败 ==> 所以对于这种情况,我给了“WaitForSingleObject”30 秒超时。

但是在这 30 秒之后,我离开了方法 'WriteFile' => 的范围,如果 GC 将运行我在方法 'WriteFile' 中作为参数提供的对象,则将被收集,当这种情况发生时我会崩溃! !-

我检查了转储,它说我有内存损坏。当我删除“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