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.