Правильный способ преждевременного прерывания 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
в то время как операции чтения / записи ожидают?
Я также должен спросить, безопасно ли одновременно выполнять ожидающие операции чтения и записи? Например, если время моего метода чтения истекло, могу ли я продолжить и попытаться что-то написать?
Трудно воспроизвести мою текущую проблему взаимоблокировки, но действительно странная часть заключается в том, что она, кажется, запускается, когда поток ввода-вывода застревает. в моем методе чтения. Я не уверен, как это вообще произойдет, если мой код работает не так, как я думаю.