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
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
Hallo DavidT,
verstehe ich nicht ganz..... Kompliziert 🤔
mfg.
markus111
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
Halo,
was genau verstehst du davon nicht?
Gruß David
was verstehst Du nicht?
Was ist genau ein Decator-Pattern? Und was meint David mit Data Polling?
X( Ist das Allgemeinwissen?
mfg.
markus111
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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
@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
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