Avatar billede rix Praktikant
14. juli 2012 - 18:20 Der er 10 kommentarer og
1 løsning

C# StreamReader lukkning problem

Jeg er igang med at lave et forsøg program. som skal con. til en server.

har fået den til at con. til serveren men når den skal lukkes kommer den med en fejl medelse som jeg ikke helt kan gøre mig klog på.

koden ser noglunde sådan her ud


        NetworkStream stream;
        TcpClient irc;
        public static StreamWriter writer;
        private string inputLine;
        StreamReader reader;
     
        Thread ctThread;

public void con(){
            irc = new TcpClient(server, port);
            stream = irc.GetStream();
            writer = new StreamWriter(stream);
            reader = new StreamReader(stream);

            ctThread = new Thread(modtag);
            ctThread.Start();
}


privte void modtag(){
while(true){
while((inputLine = reader.ReadLine()) != null){
//kode her
}
}
}


meget simpel jep men jeg er ny så

hvis jeg lukker den nu ville den bare forsætte.
har prøvet


privet void luk(){
irc.Close();
reader.Close();
write.Close();
}


og meget andet. men den bliver ved med at sige

Der kunne ikke læses data fra transportforbindelsen: En blokeringshandling blev afbrudt af et kald til WSACancelBlockingCall.

så hvordan hunden jeg får løst det problem ved jeg snart ikke. så håber nogle kan sige mig hvad jeg kan gøre bedere så jeg kan lukke den ned uden den bare forsætter eller kommer med en fejl meddelse
Avatar billede arne_v Ekspert
15. juli 2012 - 00:08 #1
Proev og stop laese traaden foerst!
Avatar billede rix Praktikant
15. juli 2012 - 01:20 #2
Jeg er ikke helt med på hvad du mener ?
Avatar billede janus_007 Nybegynder
16. juli 2012 - 17:25 #3
Du bør starte med at rydde op i din kode og poste den rigtige kode her istedet for dit pseudo-snask :)

Derudover så læs lidt op omkring streamreader mv.

Alene det her: privte void modtag(){
while(true){
while((inputLine = reader.ReadLine()) != null){
//kode her
}
}
}

Giver jo absolut intet mening.
Avatar billede rix Praktikant
17. juli 2012 - 01:14 #4
Hej.

Jeg vaglte(og vægler) ikke at vise hele koden da det ville forvirre mere end det gavner.

Ja der skal rydes op i know. men det var lidt mere tekninsk end jeg trode

men fandt ud af det
skulle bare gøre sådan her


privet void luk(){
            try
            {
                ctThread.Abort();
            }
            catch (ThreadAbortException abortException)
            {
                save_log("Stoppede tråd......");
            }
            if (reader != null)
            {
                writer.Close();
                reader.Close();
                reader = null;
                irc.Close();
            }
}


så ville den lukke det ned enderlig :)

hvis nogle ville have pointne så lig en svar.
Avatar billede janus_007 Nybegynder
17. juli 2012 - 18:45 #5
Du kan ikke Aborte en tråd sådan der, læs her: http://msdn.microsoft.com/en-us/library/ty8d3wta(v=vs.85).aspx

Dvs. der er ikke nogen garanti for at den aborte som du tænker den vil, oftest går det dog godt, men alligevel... det kan være en fejlkilde.

Hvis du alligvel fastholder så bør du som minimum sætte :

if (reader != null)
            {
                writer.Close();
                reader.Close();
                reader = null;
                irc.Close();
            }

I en finally :)
Avatar billede rix Praktikant
18. juli 2012 - 04:14 #6
Janus_007

Lige for at være sikker på at vi snakker om det samme.

Du mener vel at jeg skal have den if sættning inden jeg lukker eller afbryder forbindelsen ??
for det har jeg.
Avatar billede janus_007 Nybegynder
18. juli 2012 - 18:27 #7
Næh jeg mener du skal have den i en finally for at være sikker på den udføres :)

try
{...}
catch (ThreadAbortException abortException)
            {...

finally{
if (reader != null)
            {
                writer.Close();
                reader.Close();
                reader = null;
                irc.Close();
            }

}


Men hvad laver din tråd egentligt? Hvis den bruger de streamreaders fra din main thread skal du lave det om til at hver tråd har sine egne readers.
Avatar billede rix Praktikant
20. juli 2012 - 08:49 #8
Ahh på den måde. tænkte jeg ikke lige over.

Jeg bruger kun reader i modtag. og så lukker jeg den så når formen lukkes da den har en vigtig rolle i programet. så er det vel kun den ene jeg skal bruge?
Avatar billede janus_007 Nybegynder
21. juli 2012 - 10:14 #9
For mig at se så bruger du en reader fra din main thread inde i din worker thread og det er altså ikke det bedste pattern.

Du bør åbne din reader inde i tråden istedet og også lukke den deri.

På den måde kan du udnytte IDisposable, altså.

using(var reader = new StreamReader())
{
var irc = new TcpClient(server, port);
var stream = irc.GetStream();
var writer = new StreamWriter(stream);

while(reader....

}
Det er fint du bare har en using omkring Tcp og StreamWriteren, de bliver automatisk ryddet op når de står derinde :)


Men altså pointen er bare i alt det her, at du skal holde logikken i tråden og ikke bruge instancer fra din mainthread.
Avatar billede rix Praktikant
28. juli 2012 - 03:47 #10
Hej undskyld jeg ikke har svaret på din indlæg men er lige kommet hjem fra ferie.

Den havde jeg ikke lige set. god idé det ville jeg lige lege lidt med.

Tak. hvis du ville have de point så er de dine.
Avatar billede rix Praktikant
07. august 2012 - 07:09 #11
Hmm så tager jeg dem bare :)
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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