none
event, using und return - wann passiert was? ;-)

    Frage

  • Hi,

    meine Klasse enthält eine Methode, in welcher - eingehüllt, in einen Using-Block - ein Streamwriter lebt. Die Methode wiederum wird in einem anderen Thread ausgeführt und kann vom Haupthread beendet werden. Der Abbruch löst ein Ereignis aus. Vereinfacht sieht das so aus:

    using (streamwriter writer = new streamwriter(@"c:\datei.csv"))
    {
    writer.writeline("...");
    
    if (abbruchVonAußen)
    {
    OnAbbruchEvent();
    return;
    }
    
    }

    In einer anderen Klasse abonniere ich das Ereignis und lösche die Datei c:\datei.csv in der Ereignismethode. Das klappt, nur wird es immer klappen?

    Der Using-Block "vernichtet" den streamwriter bevor die Methode mit return verlassen wird, aber das Ereignis wird ja vor dem return ausgelöst.

    Natürlich könnte ich den streamwriter manuell schließen, die Datei löschen und dann mit return abhauen, aber ich möchte das Ereignis verwenden. Es geht mir auch nicht so sehr um den streamwriter (nur ein Beispiel), mich interessieren auch andere disposable Resourcen, die vielleicht länger brauchen um vollständig freigegeben zu werden.

    ...ist wieder ein bisschen viel Text geworden;-) Vielen Dank für's Lesen.

    LG;-)


    • Bearbeitet free.runn3r Samstag, 10. August 2013 11:29
    Samstag, 10. August 2013 11:16

Antworten

  • Hi,

    der StreamWriter wird "vernichtet", wenn du den Using Block verlässt (was mit Return geschieht). Da die OnAbbrichEvent Methode vorher aufgerufen wird, sind zu dem Zeitpunkt die Ressourcen des StreamWriter noch nicht freigegeben.

    Using übernimmt grundlegend die Aufgabe eines Try/Catch/Finally Blocks und sorgt dafür das die Ressource auf jeden Fall freigegeben wird, selbst wenn eine Exeption geworfen wird. Vor deinem OnAbbruchEvent könntest Dispose aufrufen. Dispose solltest du so oft aufrufen können wie du willst.

    MFG

    Björn 

    • Als Antwort markiert free.runn3r Samstag, 10. August 2013 11:55
    Samstag, 10. August 2013 11:45

Alle Antworten

  • Hi,

    der StreamWriter wird "vernichtet", wenn du den Using Block verlässt (was mit Return geschieht). Da die OnAbbrichEvent Methode vorher aufgerufen wird, sind zu dem Zeitpunkt die Ressourcen des StreamWriter noch nicht freigegeben.

    Using übernimmt grundlegend die Aufgabe eines Try/Catch/Finally Blocks und sorgt dafür das die Ressource auf jeden Fall freigegeben wird, selbst wenn eine Exeption geworfen wird. Vor deinem OnAbbruchEvent könntest Dispose aufrufen. Dispose solltest du so oft aufrufen können wie du willst.

    MFG

    Björn 

    • Als Antwort markiert free.runn3r Samstag, 10. August 2013 11:55
    Samstag, 10. August 2013 11:45
  • Mist,

    genau das hab ich mir gedacht. Also muss ich bei einem gewollten Abbruch von außen (durch den Nutzer) doch alles manuell aufräumen:-(

    Danke für deine Antwort Björn.

    LG;-)

    Samstag, 10. August 2013 11:53