Oprettet lør. d. 14. juli 2012 kl. 18:20:45

rix17172
rix17172 (5.265 point. Point ude: 0)

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

Skrevet søn. d. 15. juli 2012 kl. 00:08:47| #1

arne_v
arne_v (1.050.298 point)
Proev og stop laese traaden foerst!

Skrevet søn. d. 15. juli 2012 kl. 01:20:15| #2

rix17172
rix17172 (5.265 point)
Jeg er ikke helt med på hvad du mener ?

Skrevet man. d. 16. juli 2012 kl. 17:25:09| #3

janus_007
janus_007 (34.205 point)
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.

Skrevet tir. d. 17. juli 2012 kl. 01:14:36| #4

rix17172
rix17172 (5.265 point)
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.

Skrevet tir. d. 17. juli 2012 kl. 18:45:47| #5

janus_007
janus_007 (34.205 point)
Du kan ikke Aborte en tråd sådan der, læs her: http://msdn.microsoft.com/ (...)(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 :)

Skrevet ons. d. 18. juli 2012 kl. 04:14:45| #6

rix17172
rix17172 (5.265 point)
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.

Skrevet ons. d. 18. juli 2012 kl. 18:27:01| #7

janus_007
janus_007 (34.205 point)
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.

Skrevet fre. d. 20. juli 2012 kl. 08:49:30| #8

rix17172
rix17172 (5.265 point)
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?

Skrevet lør. d. 21. juli 2012 kl. 10:14:02| #9

janus_007
janus_007 (34.205 point)
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.

Skrevet lør. d. 28. juli 2012 kl. 03:47:33| #10

rix17172
rix17172 (5.265 point)
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.

Skrevet tir. d. 07. august 2012 kl. 07:09:33| #11

rix17172
rix17172 (5.265 point)
Hmm så tager jeg dem bare :)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

C# Exception handling

Oprettet den 14. juni 2013 kl. 08.32
shako giver 60 point for svar | Giv et svar »

Login i ASP.NET

Oprettet den 12. juni 2013 kl. 13.54
bdef giver 30 point for svar | Giv et svar »

Array som property i Visual Studio

Oprettet den 12. juni 2013 kl. 13.21
HPCISCO giver 150 point for svar | Giv et svar »







IT Kurser
Samarbejdspartnere

Udgiver · © 2013 Computerworld A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger