Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Čitanje sa network streama u petlji bez blokiranja

[es] :: .NET :: Čitanje sa network streama u petlji bez blokiranja

[ Pregleda: 984 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

blaza985
student

Član broj: 263445
Poruke: 2
95.180.82.*



Profil

icon Čitanje sa network streama u petlji bez blokiranja01.07.2010. u 11:29 - pre 168 meseci
Pozdrav. Imam jedan problem koji ne uspevam da rešim. Naime, u jednom delu programa je potrebno da u petlji čitam sa network streama, ali tako da ne dodje do blokiranja petlje usled čekanja da podaci pristignu od strane klijenta. Pokušao sam da uradim to na nekoliko načina, ali ne uspeva. Za početak da napišem prvo code:

Code:

            NetworkStream stream = new NetworkStream(socket);
            StreamReader reader = new StreamReader(stream);
            BinaryFormatter formatter = new BinaryFormatter();
            StreamWriter writer = new StreamWriter(stream);

            string msg = reader.ReadLine();

            while (msg != "END")
            {
                
                switch (msg)
                {
                    
                    case "WRITE":
                        {
                            Write();
                            break;
                        }
                    case "RETURN":
                        {
                            ReturnRecord();
                            break;
                        }
                    case "FIND":
                        {
                            FindRecord();
                            break;
                        }                    
                    default:
                        break;
                }

                if (stream.DataAvailable)
                {
                    msg = reader.ReadLine();
       
                }
                else
                {
                    msg = "";
                }

            }



E sad, umesto sledećeg dela code-a:

Code:

                if (stream.DataAvailable)
                {
                    msg = reader.ReadLine();
       
                }
                else
                {
                    msg = "";
                }



pokušao sam na još par načina, između ostalog i sa:

Code:

                if (reader.Peek() != -1)
                {
                    msg = reader.ReadLine();                    
                }
                else
                {
                    msg = "";
                }


Dakle, bitno mi je da u samoj petlji ne dodje do blokiranja pri pozivu Readline metode. Kod mene pri korišćenju nekog od prethodnih načina program upada u beskonačnu petlju jer reader.Peek() uvek vraća -1, iako su podaci sa klijenta poslati. Slično se dešava i korišćenjem stream.DataAvailable. U funkcijama Write(), ReturnRecord() i FindRecord() koristim BinaryFormatter za deserijalizaciju sa streama, i izgleda da zbog toga dolazi do problema, jer čim se program vrati iz neke od tih funkcija (gde je vršio deserijalizaciju na streamu) reader.Peek uvek vraća -1 iako su podaci sa klijenta poslati.
Ako uklonim iz programa uslov if(reader.Peek != -1), program radi kako treba, ali dolazi do blokiranja u petlji koje želim da izbegnem. Nije mi jasno zašto se Peek() pogubi nakon korišćenja deserijalizacije.

Jel ima neko ideju kako bih ovo mogao da rešim?

 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: Čitanje sa network streama u petlji bez blokiranja01.07.2010. u 13:43 - pre 168 meseci
Koristi asinhrono citanje. Pogledaj u dokumentaciji BeginRead() metod. Poenta je da ces mu dati funkciju koju ce ti pozvati kada podaci stignu, onda u toj funkciji obradis te podatke i ponovo pozoves BeginRead.
 
Odgovor na temu

blaza985
student

Član broj: 263445
Poruke: 2
95.180.82.*



Profil

icon Re: Čitanje sa network streama u petlji bez blokiranja01.07.2010. u 15:09 - pre 168 meseci
Probao sam i to, ali to poprilično komplikuje sve jer je već u pitanju program sa vise threadova. Želeo sam da izbegnem u ovom delu programa stvaranje novih threadova. Potpuno mi je nejasno zašto tako prosta stvar kao Peek ne funkcioniše.
 
Odgovor na temu

[es] :: .NET :: Čitanje sa network streama u petlji bez blokiranja

[ Pregleda: 984 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.