StreamSocket : datareader.LoadAsync wartet infinte auch wenn die Daten avaialbe
Ich habe folgenden code in meine Windows phone 8 app.
//connection code, done during app start
socket = new StreamSocket();
await socket.ConnectAsync(serverHostName, serviceName);
dataReader = new DataReader(socket.InputStream);
dataReader.InputStreamOptions = InputStreamOptions.Partial;
dataWriter = new DataWriter(socket.OutputStream);
Nachdem die Verbindung hergestellt wurde, habe ich einen anderen thread, prüft auf eintreffende Netzwerk-Pakete
await dataReader.LoadAsync(2048);
dataReader.ReadBytes(buffer);
----------
Workflow ist wie folgt
- Telefon eine Verbindung zum server über socket.ConnectAsync
- Server antwortet mit der ersten Nachricht (Handy erhält, diese richtig im dataReader.LoadAsync Funktion)
- Telefon sendet nun das 'fachliche' Anfrage
- Server antwortet mit 'fachliche' Antwort (Problem liegt hier. Handy nicht den Empfang der Antwort vom server an einige der Zeit).
Es ist kein Szenario Unterschied zwischen arbeitenden Staat' und 'nicht-arbeiten-Staat".
Also habe ich versucht zu Debuggen. Ich setzen Sie einen Haltepunkt für den dataReader.LoadAsync und sah, dass die Ausführung wartet unendlich auf den Anruf.
Sicherstellen, dass der server Daten sendet, richtig, ich lief die app im Windows phone-emulator und lief die WireShark network analyzer in den PC. Ich konnte sehen, dass Pakete empfangen werden, die für die IP-Adresse des Telefons.
Jemand irgendwelche Hinweise, warum der dataReader.LoadAsync Funktion rufen nicht zurück, wenn es Daten fertig zu werden, Lesen Sie in der Steckdose?
- Es wird warten, bis 2048 bytes zur Verfügung stehen. Nicht weniger.
- ich habe InputStreamOption Teilweise, was bedeutet, LoadAsync wird zurückkehren, sobald das erste byte verfügbar ist.
- My bad, ich war mit einem winzigen smartphone, jetzt sehe ich es.
- Wie groß ist die ersten Puffer, die Sie übergeben, um ReadBytes? Sind Sie sicher, dass es nicht mehr dataReader.unconsumedBufferLength verfügbar?
- Ja, ich bin sicher, dass die UnconsumbedBufferLength null ist. Ich tun, verbrauchen alle gelesenen bytes in der erste Anruf mit der Funktion ReadBytes. Halten Sie den code einfach & übersichtlich, ich konnte nicht den gesamten code hier.
- Ich hatte genau dasselbe problem, aber ich war mit der SerialDevice Klasse " stream mit mein DataReader. Ich denke mehr und mehr, dass dies entweder ein bug oder eine falsche Dokumentation der Funktionalität.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vor dem gleichen problem. Es ist besonders schlecht für Bluetooth RFCOMM, SPP-serial port-Geräte, weil die zugrunde liegende Rfcomm-Objekt bietet keine Funktionen für die Einstellung ReadTimeout Werte.
Edit: Die InputStreamOptions.Teilweise option scheint zu funktionieren UWP Win10-Plattform, aber es ist nur hilfreich, wenn Sie bereits wissen, viel Daten, die Sie erwarten. Sonst wird es warten, auf unbestimmte Zeit auf dem letzten Aufruf.
Ich habe fast aufgegeben, wenn ich in den Referenzen unterhalb dieser Zeilen um das problem zu lösen, indem eine CancellationTokenSource
So dass diese Methode ist nur ein brute-force-last-resort Versuch, ein time-out.
Die Methode von @mayu funktioniert sehr gut (serialDevice.ReadTimeout), aber nur auf Geräten der Klasse Windows.- Geräte.SerialCommunication.SerialDevice, aber nicht auf
Windows.- Geräte.Bluetooth.Rfcomm.RfcommDeviceService. Ich weiß nicht, wie die situation ist, um TCP/IP-sockets.
Kurz ist, gibt es einen brauchbaren time-out für RFCOMM, SPP Bluetooth-verbindungen?
Oder irgendeine Methode, zu wissen, vor der Zeit, wenn .LoadAsync(1) wird blockiert, weil keine neuen Daten vorliegen?
Dieser Kerl über Sie auf MSDN hat genau das gleiche problem, aber MS weiß nicht, die Antwort entweder: https://social.msdn.microsoft.com/Forums/vstudio/en-US/71ea17d4-ca16-43c2-ab43-02d5301def3f/chow-to-set-timeout-on-streamsocketreadasync?forum=wpdevelop
Referenzen:
Im UWP StreamSocket, kann ich die Daten Lesen mit timeout und die Verbindung offen lassen, wenn timeout abgelaufen ist
https://social.msdn.microsoft.com/Forums/en-US/8a5c4fdc-28d6-4a22-8df6-bc519efeaa4d/how-to-control-the-timeout-for-reading-from-streamsocket?forum=winappswithcsharp
DataReader der SocketStream für UWP-App
"Gemäß der Dokumentation bei der Verwendung von InputStreamOptions.Teilweise verwenden, sollten Sie UnconsummedBufferLength anstelle einer hartcodierten Wert"
Dieser Probe scheint kaputt zu sein.
"erwarten den Leser.LoadAsync(reader.UnconsumedBufferLength);" äquivalent ist zu
erwarten den Leser.LoadAsync(0); und dann ist es nicht möglich, Lesen Sie alle Daten, da du keine Puffer zum Lesen aus.
Teste ich das jetzt und wie es scheint " - Leser.InputStreamOptions = Partial;" hat überhaupt keine Wirkung. Meine einzige Lösung ist das senken der read-timeout.
Gemäß der Dokumentation bei der Verwendung von InputStreamOptions.Teilweise verwenden, sollten Sie UnconsummedBufferLength anstelle einer hartcodierten Wert :
Probe ist es
Ich hatte ein ähnliches problem mit Windows Remote Arduino-Bibliothek und SerialUSB stream. Ich hatte, dies zu ändern, Bibliothek und rufen LoadAsync(1) statt der ursprünglichen LoadAsync(100). Nun der code ist in Ordnung.
finden Sie unter: https://github.com/ms-iot/remote-wiring/issues/111
Für serielle Geräte, die Sie benötigen, um
device.ReadTimeout = TimeSpan.FromMilliseconds(100);
für die LoadAsync zurückgegeben werden, bevor der Puffer voll ist.
Die einzige Möglichkeit, die ich gefunden, um nicht zu wissen, die Größe der Daten vor dem Lesen war zu Lesen von einem byte zu einem Zeitpunkt, bis ich einen timeout. Fühlt sich schrecklich, aber funktioniert. Gibt es eine bessere Möglichkeit noch?