locked
Primitive Rückgabewerte von Servicefunktionen gehen verloren bzw. enden im Timeout, wenn parallel kontinuierlich Daten angefordert und übertragen werden RRS feed

  • Frage

  • Hallo,

    ich bin dabei einen Service zu entwickeln, welcher kontinuierlich Bilder (bspw. von einer Kamera) erfassen kann. Gesteuert wird das ganze mittels WCF über Netzwerk von einem Host (Client). Um Kontroll- sowie Bilddaten voneinander zu trennen werden zwei ServiceHosts mit unterschiedlichen Ports erstellt (Nachriten und Stream basiert), deren Schnittstellen von einer einzigen Instanz implementiert werden.

    Das ganze funktioniert im Prinzip auch alles ohne Probleme, außer wenn der Client sich über neue Bilder (kontinuierlich) informieren lässt und diese ständig vom Service abholt (bspw. alle 20 - 40 ms). In diesem Fall kommt es zu Problemen bei den Rückgabewerten von Kontrollbefehlen (bspw. wenn ein Aufnahmestop-Befehl an den Service geschickt wird, welcher daraufhin ordnungsgemäß stopt  (innerhalb von 1-2 ms) und als Resultat "true" zurück liefert), da diese beim Client nicht ankommen bzw. eine Timeout-Exception geworfen wird. Dies ist nicht der Fall, wenn auf das kontinuierliche Abholen der aktualisierten Bilder verzichtet wird, so dass meine Vermutung ist, dass der Kommunikationskanal "überlastet" ist. (Bilddatenrate liegt bei ca. 20 MB/s).

    Ich habe mir auch die WCF Aktivitäten beim Service sowie Client aufzeichnen lassen und man sieht dort, dass der Service seine Rückgabewerte wie gewünscht als Nachricht verschickt, allerdings kommen diese nicht beim Client an (demzufolge Timeout).

    Eine Möglichkeit wäre nun den Timeout-Wert zu erhöhen, was allerdings den Client u.U. unnötig blockieren könnte, da der Aufruf synchron erfolgen sollte (es ist ja nur ein primitiver Rückgabewert). Besser wäre es eine Art Priorität zu haben oder alles noch ausstehende auf dem Kommunikationskanal zu verwerfen, damit dieser "frei" ist.

    Ich hoffe ich habe keine wichtigen Infos vergessen und vielleicht hat jemand von euch eine Idee, wo genau die Ursache für die Problematik liegt und wie sich diese lösen lässt.

    Danke.

    Grüße

    Nic

    EDIT: Eine Erhöhung des Timeouts bringt nichts, hierbei wird ledglich der Client entsprechend lange blockiert, bis die Timout-Exception zuschlägt. D.h. die Rückgabewerte gehen irgendwie verloren. Weitere Tests haben auch gezeigt, dass dies auch passieren kann, wenn keine Bilddaten geholt werden, sondern nur die kontinuierlichen Informationen ("Bild kann geladen werden") verschickt werden.


    • Bearbeitet nk7de Montag, 6. August 2012 08:45 Weitere Tests
    Freitag, 20. Juli 2012 14:41