Повреждение памяти и исключение System.ExecutionEngineException при использовании перекрывающегося ввода-вывода в C#C#

Место общения программистов C#
Ответить
Anonymous
 Повреждение памяти и исключение System.ExecutionEngineException при использовании перекрывающегося ввода-вывода в C#

Сообщение Anonymous »

Я работаю над проектом, в котором общаюсь с устройством, используя последовательные порты, через перекрывающийся ввод-вывод на C#. Иногда я сталкиваюсь с исключением System.ExecutionEngineException, указывающим на повреждение памяти. Вот упрощенная версия моей реализации:
_portHandle = CreateFile(
@$"\\.\\{_portName}", // Serial port name (e.g., \\.\COM1)
GENERIC_READ | GENERIC_WRITE, // Access mode
0, // Share mode
IntPtr.Zero, // Security attributes
OPEN_EXISTING, // Open existing
FILE_FLAG_OVERLAPPED, // Overlapped mode for asynchronous I/O
IntPtr.Zero // Template file (must be NULL for serial ports)
);

Код обрабатывает операции ввода-вывода в потоке с использованием NativeOverlapped:
private void ReadThread(CancellationToken token)
{
IntPtr overlappedPtr = IntPtr.Zero;

try
{
IntPtr portHandle = _portHandle;
SetupComPort(portHandle);

var buffer = new byte[16 * 1024];
uint eventMask = 0;

using var waitEvent = new ManualResetEvent(false);

var overlapped = new NativeOverlapped
{
OffsetLow = 0,
OffsetHigh = 0,
EventHandle = waitEvent.SafeWaitHandle.DangerousGetHandle()
};

overlappedPtr = Marshal.AllocHGlobal(Marshal.SizeOf());
Marshal.StructureToPtr(overlapped, overlappedPtr, false);

while (!token.IsCancellationRequested)
{
if (WaitCommEvent(portHandle, ref eventMask, ref overlapped))
{
if ((eventMask & EVRXCHAR) != 0)
{
ReadFile(portHandle, buffer, (uint)buffer.Length, out uint bytesRead, overlappedPtr);
// Process incoming data
}
}
}
}
finally
{
if (overlappedPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(overlappedPtr); // Cleanup memory
}
}
}

Что я пробовал до сих пор:
  • Ручное управление памятью:

    Используется Marshal.AllocHGlobal и Marshal.FreeHGlobal для NativeOverlapped.
    Гарантируется правильное выделение и освобождение NativeOverlapped.
    Потокобезопасность:
  • Критические операции заключены в блокировки.
  • Проверено наличие ошибок, таких как ERROR_IO_PENDING, и корректно обработано.


Подробнее здесь: https://stackoverflow.com/questions/793 ... lapped-i-o
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»