Avatar billede Droa Seniormester
31. maj 2018 - 12:15 Der er 2 kommentarer og
1 løsning

Design til og læse en uendelig stream

Hej Eksperter

Jeg er igang med og lave noget med en NetworkStream, der køre over TCP som en stream.

Streamen skal holdes åben og modtage events der skal behandles af serveren.


Jeg sidder dog lidt i et dilemma og ikke rigtigt kan finde et design der ligner det jeg leder efter, og ville høre om det er fordi jeg gør det forkert?


siden streamen aldrig lukker, tænker jeg at min Reader heller aldrig skal stoppe, og derved returnere i form Observer designs til hvad der skal ske.


NetworkStream->Reader->Events [OnMessageRcv|OnDataRcv|OnStatusRcv|etc...]

og registrere mine processor til disse events på min Reader.

Findes der et eksempel på dette, eller et anbefalet alternativ?
Avatar billede arne_v Ekspert
01. juni 2018 - 03:05 #1
Du har vel naesten designet det selv.


using System;
using System.IO;

namespace E
{
    public delegate void LineProcessor(string line);
    public delegate void EndProcessor();
    public class EventReader
    {
        public event LineProcessor GotLine;
        public event EndProcessor GotEnd;
        private TextReader tr;
        public EventReader(TextReader tr)
        {
            this.tr = tr;
        }
        public void Run()
        {
            String line;
            while((line = tr.ReadLine()) != null)
            {
                GotLine(line);
            }
            GotEnd();
        }
    }
    public class Program
    {
        public static void DumpLine1(string line)
        {
            Console.WriteLine("1: {0}", line);
        }
        public static void DumpLine2(string line)
        {
            Console.WriteLine("2: {0}", line);
        }
        public static void End()
        {
            Console.WriteLine("STOP");
        }
        public static void Main(string[] args)
        {
            EventReader er = new EventReader(Console.In);
            er.GotLine += DumpLine1;
            er.GotLine += DumpLine2;
            er.GotEnd += End;
            er.Run();
            Console.ReadKey();
        }
    }
}
Avatar billede Droa Seniormester
01. juni 2018 - 06:53 #2
Det er sådan set også sådan jeg har lavet det, jeg viste bare ikke helt om det var et legitimt design som andre ville forstå, fordi designet er jo simpelt nok, men mere om det er forståeligt.
Avatar billede arne_v Ekspert
01. juni 2018 - 14:48 #3
Givet problemstillingen maa et uendelig loekke som kalder metoder ved forskellige laesninger vaere det rigtige.

Hvis der for en given reader altid vil vaere praecis en metode som skal kaldes i en given metode, saa kunne man sende dem med over i constructor eller Run metode.

Men kan der vaere ingen, en eller flere saa er er event modellen altsaa meget praktisk.

Man kunne kode det manuelt med List<Handler> fremfor event, men det er der ikke megen pointe i.

EventHandler signatur boer nok foelge standard model for argumenter (min kode ovenfor goer ikke).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester