Gå til innhold

stream forvirring - hvem skal lukkes?


Anbefalte innlegg

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
  • 2 uker senere...
Videoannonse
Annonse

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
  • 2 uker senere...

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 av invictus
Lenke til kommentar
  • 2 uker senere...

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...