abcd423417984 Skrevet 22. juli 2006 Del Skrevet 22. juli 2006 Når man jobber med sockets (eller filer for den saks skyld, men bruker sockets som eksempel her) så oppretter man gjerne noen streams for å benytte seg av disse. I mitt tilfelle har jeg 1 socket og 3 streams; TcpClient client = new TcpClient(...); NetworkStream ns = client.GetStream(); StreamReader sr = new StreamReader(ns); StreamWriter sw = new StreamWriter(ns); og så etter bruk kjører jeg: sr.Close(); sr = null; sw.Close(); sw = null; ns.Close(); ns = null; client.Close(); client = null; Men er egentlig alle disse linjene for å lukke nødvendig? Jeg har egentlig ikke funnet noen god oversikt over HVA som faktisk lukkes ved å lukke f.eks. bare ene streamen. Hvis jeg f.eks. KUN kjører ns.Close(), vil ikke da også sw, sr og client være ganske ubrukelige etterpå? Spørsmålet mitt er egentlig følgende: holder det å lukke kun socketen/filen ELLER ene streamen så vil resten automatisk også lukke seg? Takker for svar. Lenke til kommentar
wolf5 Skrevet 31. juli 2006 Del Skrevet 31. juli 2006 Tror MS .Net objekter med Close() metoder også har disse liggende i sine respektive Dispose() metoder som kalles når garbage collectoren kicker inn. Men vet ikke om f.eks NetworkStream sender ut hendelser på at den lukkes slik at StreamReader og StreamWriter kan reagere på dette. NetworkStream sin dispose metode: protected override void Dispose(bool disposing) { if ((!this.m_CleanedUp && disposing) && (this.m_StreamSocket != null)) { this.m_Readable = false; this.m_Writeable = false; if (this.m_OwnsSocket) { System.Net.Sockets.Socket socket1 = this.m_StreamSocket; if (socket1 != null) { socket1.InternalShutdown(SocketShutdown.Both); socket1.Close(this.m_CloseTimeout); } } } this.m_CleanedUp = true; base.Dispose(disposing); } Det er ihvertfall rett kode praksis å lukke slike objekter. Jeg tror også du kan bruke using syntaksen for å slippe å kjøre .Close på objektet. F.eks using(sr){ //min kode... } } så skal sr objektet lukkes etter at koden har kommet ut av blokken. Off topic. Jeg bruker forsåvidt kun Socket objektet når jeg koder TCP trafikk. Synes jeg har mer kontroll slik. (https://www.diskusjon.no/index.php?showtopic=588667&hl=) Lenke til kommentar
abcd423417984 Skrevet 9. august 2006 Forfatter Del Skrevet 9. august 2006 (endret) Er jo fremdeles litt klønete med using hvis jeg må ha det både for Socket, NetworkStream, StreamReader og StreamWriter. Men det virker som hvis jeg kjører .Close på StreamReader så får jeg exception ved å kjøre .Close på StreamWriter (og omvendt). En annen ting. Objektet settes vel ikke automatisk til null etter Dispose, så hvordan kan jeg sjekke hvorvidt et objekt er disposed eller ikke? Endret 10. august 2006 av invictus Lenke til kommentar
wolf5 Skrevet 10. august 2006 Del Skrevet 10. august 2006 Har sett at noen objekter har en IsDisposed eller Disposed boolsk var. Alternativt kan du prøve å gjøre noe på objektet i en try-catch løkke og grabbe ObjectDisposedException som vil oppstå om objektet er disposed. Lenke til kommentar
GeirGrusom Skrevet 19. august 2006 Del Skrevet 19. august 2006 Hvis du lukker streamen burde alle writers og readers bli ugyldig allikevel, og de forsvinner ofte ut av scope før streamen allikevel. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå