Правильный способ преждевременного прерывания BeginRead и BeginWrite?

У меня есть утилита, написанная на C # для связи с нашим USB-устройством. Мы используем универсальный драйвер HID и оборачиваем ручку устройстваFileStream объект. Я читаю / пишу данные, используя егоBeginRead а такжеBeginWrite методы, не потому, что мне нужен асинхронный ввод-вывод, а просто, чтобы я мог тайм-аут в случае, если устройство переходит в неинфекционное состояние (намеренно или нет). Все чтение / запись осуществляется в моей собственной теме ввода-вывода.

Я обеспокоен тем, что я не совсем все делаю должным образом, потому что я видел несколько случаев того, что, как я подозреваю, является тупиковым потоком. Вот урезанная версия моей соответствующейRead метод (который, кажется, работает просто отлично).

if (_readResult == null)
{
  _readResult = _deviceStream.BeginRead(_readBuffer, 0, _readBuffer.Length, null, null);
}

if (_readResult.AsyncWaitHandle.WaitOne(IOTimeout, true))
{
  int bytesRead = _deviceStream.EndRead(_readResult);
  _readResult.AsyncWaitHandle.Close();
  _readResult= null;
  // … Copy bytes to another buffer
}
else
{
  // … Timeout, so retry again in a bit
}

Мой основной вопрос - как правильно остановить незаконченноеBeginRead или жеBeginWrite позвоните, если мне нужно прервать поток ввода-вывода, и мое устройство больше не связывается. Я не могу просто позвонитьEndRead потому что он будет сидеть там и блокировать навсегда. Это безопасно звонитьFilestream.Close в то время как операции чтения / записи ожидают?

Я также должен спросить, безопасно ли одновременно выполнять ожидающие операции чтения и записи? Например, если время моего метода чтения истекло, могу ли я продолжить и попытаться что-то написать?

Трудно воспроизвести мою текущую проблему взаимоблокировки, но действительно странная часть заключается в том, что она, кажется, запускается, когда поток ввода-вывода застревает. в моем методе чтения. Я не уверен, как это вообще произойдет, если мой код работает не так, как я думаю.

Ответы на вопрос(1)

Ваш ответ на вопрос