Richtige Möglichkeit, BeginRead und BeginWrite vorzeitig abzubrechen?

Ich habe ein Dienstprogramm, das ich in C # geschrieben habe, um mit unserem USB-Gerät zu kommunizieren. Wir verwenden den generischen HID-Treiber und wickeln ein Handle in einFileStream Objekt. Ich lese / schreibe Daten mit seinerBeginRead undBeginWrite Methoden, nicht, weil ich asynchrone E / A benötige, sondern nur, um eine Zeitüberschreitung zu vermeiden, falls das Gerät in einen nicht kommunizierbaren Zustand wechselt (absichtlich oder nicht). Das Lesen / Schreiben erfolgt in meinem eigenen dedizierten IO-Thread.

Ich mache mir Sorgen, dass ich die Dinge nicht richtig mache, weil ich ein paar Fälle von Thread-Deadlock gesehen habe, von denen ich vermute. Hier ist eine abgespeckte Version meiner relevantenRead Methode (die gut zu funktionieren scheint).

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
}

Meine Hauptfrage ist, wie man ein unfertiges richtig stopptBeginRead oderBeginWrite call, wenn ich meinen IO-Thread beenden muss und mein Gerät nicht mehr kommuniziert. Ich kann nicht einfach anrufenEndRead weil es dort sitzen und für immer blockieren wird. Ist es sicher anzurufen?Filestream.Close während Lese- / Schreibvorgänge anstehen?

Ich muss auch fragen, ob es sicher ist, ausstehende Lese- und Schreibvorgänge gleichzeitig auszuführen. Kann ich nach einer Zeitüberschreitung meiner Lesemethode trotzdem versuchen, etwas zu schreiben?

Es ist schwer, mein aktuelles Deadlock-Problem zu reproduzieren, aber der wirklich seltsame Teil scheint zu beginnen, wenn der IO-Thread in meiner Lesemethode "hängen bleibt". Ich bin mir nicht sicher, wie das überhaupt passieren würde, wenn mein Code nicht so funktioniert, wie ich es mir vorstelle.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage