Laden...

Benachrichtigung sobald neue Daten im Stream vorhanden sind?

Erstellt von markus111 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.746 Views
markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren
Benachrichtigung sobald neue Daten im Stream vorhanden sind?

Hallo Community,

wie kann ich es am besten mitbekommen, wenn neue Daten in einem Stream vorhanden sind?

Mein Beispiel: Ich leite den StandardOutput eines Prozesses um, und möchte nun mitbekommen, wenn neue Daten im Stream vorhanden sind.

Wie geht das am einfachsten?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
998 Beiträge seit 2007
vor 15 Jahren

Hallo,

hmm also die Streams arbeiten doch nach dem Dekorator-Pattern... Mein erster Ansatz wäre es, einen eigenen Dekorierer zu schreibenen, der nach öffnen des Streams einen Timer laufen lässt der mit Polling bestimmt, wann neue Daten da sind und dann ein Event auslöst.

Gruß David

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

Hallo DavidT,

verstehe ich nicht ganz..... Kompliziert 🤔

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
57 Beiträge seit 2009
vor 15 Jahren

Hallo markus111,

was verstehst Du nicht?

Was ein Stream ist?
Was ein Decorator-Pattern ist?
Was David mit Data Polling meint?
Was ein Timer ist?
Was ein Event ist?

Gruß
Assri Komla

998 Beiträge seit 2007
vor 15 Jahren

Halo,

was genau verstehst du davon nicht?

Gruß David

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

was verstehst Du nicht?

Was ist genau ein Decator-Pattern? Und was meint David mit Data Polling?

X( Ist das Allgemeinwissen?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
1.044 Beiträge seit 2008
vor 15 Jahren

Hallo markus111,

Was ist genau ein Decator-Pattern?

Das Decorator-Pattern ist ein strukturelles Muster, das es ermöglich, dass Klassen für eine Erweiterung offen, aber für eine Veränderung geschlossen sind. Die Stream-Klassen im .NET-Framework sind nach diesen Prinzip aufgebaut. Wie das Decorator-Pattern im einzelnen Aufgebaut ist, möchte ich nicht erklären (s. O´Reilly: Entwurfsmuster von Kopf bis Fuß). Hier findest du noch ein einfaches Beispiel, wie das Decorator-Pattern aufgebaut ist: http://dofactory.com/Patterns/PatternDecorator.aspx . [Hinweis] Wie poste ich richtig? Punkt 1.2.

zero_x

S
260 Beiträge seit 2007
vor 15 Jahren

Das Decorator-Pattern wird verwendet wenn man eine Klasse zur Laufzeit um zusätzliche Funktionalität erweitern will und die vorhandene Klasse nicht verändert werden soll.

Mfg
Michael

S
902 Beiträge seit 2007
vor 15 Jahren

@Markus

das könnte ungefähr so aussehen:


public class PollingStream:Stream
    {
        private Stream _stream;
        private long _oldLenght;
        private Timer _timer = new Timer();

        public event EventHandler NewDataAvailable;
        
        private void OnNewDataAvailable()
        {
            if (NewDataAvailable != null)
                NewDataAvailable(this, new EventArgs());
        }

        private void _timer_Elapsed(object sender, EventArgs e)
        {
            if (_oldLenght != _stream.Length)
            {
                _oldLenght = _stream.Length;
                OnNewDataAvailable();
            }
        }

        public PollingStream(Stream baseStream)
        {
            _stream = baseStream;
            _oldLenght = _stream.Length;
            _timer.Elapsed+=new ElapsedEventHandler(_timer_Elapsed);
            _timer.Interval = 100;
        }

        public void StartPolling()
        {
            _timer.Start();
        }

        public void StopPolling()
        {
            _timer.Stop();
        }
}

anwenden kann man ihn dann ca so:


MemoryStream ms = new MemoryStream();
            PollingStream ps = new PollingStream(ms);
            ps.NewDataAvailable+=new EventHandler(ps_NewDataAvailable);
            ps.StartPolling();

            Console.ReadLine();
            ps.Write(new byte[] { 1 }, 0, 1);
            Console.ReadLine();

mfg serial

M
1.439 Beiträge seit 2005
vor 15 Jahren

Hallo markus111!

Vergiss das mit dem Polling diese Lösung ist sehr ineffizient.
Ruf die Stream.Read Methode auf, diese blockiert bis Daten im Stream zum Lesen vorhanden sind. Sobald Daten im Stream vorhanden sind, werden diese in den Puffer kopiert und die Read-Methode kehrt zurück. Als Rückgabewert bekommst du die Anzahl der gelesenen Bytes und kannst bei Bedarf einen Event feuern.

Grüße,
Georg