如果有可能的失败选项,如何使用win32 :: WriteFile?

时间:2012-04-19 23:44:56

标签: c# c++

我使用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 );
          }
          }
 } 

0 个答案:

没有答案