Właściwy sposób na przedwczesne przerwanie BeginRead i BeginWrite?

Mam narzędzie, które napisałem w języku C #, aby komunikować się tam iz powrotem za pomocą naszego urządzenia USB. Używamy ogólnego sterownika HID i owijamy uchwyt urządzeniaFileStream obiekt. Czytam / zapisuję dane za pomocą jegoBeginRead iBeginWrite metod, nie dlatego, że potrzebuję asynchronicznego IO, ale po prostu mogę przekroczyć limit czasu w przypadku, gdy urządzenie wejdzie w stan niezwiązany (celowo lub nie). Cały odczyt / zapis odbywa się we własnym dedykowanym wątku IO.

Obawiam się, że nie robię tego właściwie, ponieważ widziałem kilka przypadków tego, co, jak podejrzewam, jest zakleszczeniem wątku. Oto uproszczona wersja moich istotnychRead metoda (która wydaje się działać dobrze).

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
}

Moje główne pytanie brzmi: jak właściwie zatrzymać niedokończoneBeginRead lubBeginWrite zadzwoń, jeśli muszę zakończyć mój wątek IO, a moje urządzenie nie komunikuje się. Nie mogę tak po prostu zadzwonićEndRead ponieważ będzie tam siedzieć i blokować na zawsze. Czy można bezpiecznie zadzwonić?Filestream.Close podczas gdy operacje odczytu / zapisu są w toku?

Muszę też zapytać, czy jednoczesne operacje odczytu i zapisu są bezpieczne? Na przykład, jeśli moja metoda odczytu przekroczy limit czasu, czy nadal mogę coś napisać?

Trudno jest odtworzyć mój obecny problem z zakleszczeniem, ale naprawdę dziwna część wygląda na to, że zaczyna się, gdy wątek IO „utknie” w mojej metodzie odczytu. Nie wiem, jak to się stanie, jeśli mój kod nie działa tak, jak myślę.

questionAnswers(1)

yourAnswerToTheQuestion