Ereignismethode in Thread registrieren

06/03/2009 - 13:37 von Michael | Report spam
Hallo

Ich habe einem Thread, in welchem ich eine Ereignisbehandlungsmethode
registriert habe. Über eine Abbruchschlaufe warte ich, bis der Thread beendet
werden soll.

Nun ist mir aber aufgefallen, dass ich die Abbruchschlaufe auch ganz weg
lassen kann. Das heisst, der Thread registriert nur die Ereignismethode und
wird anschliessend gleich beendet.

Wird das Ereignis trotzdem in dem "separaten Thread" ausgeführt?
Wie zerstöre ich die Ereignismethode?

Hier ein bisschen Code als Erklàrungsstütze

public void Main()
{
// ...

ThreadStart ts1 = new ThreadStart(Write);
Thread wt = new Thread(ts1);
wt.Name = "WriteThread";
wt.Start();
// ...
}

public void Write()
{
FileSystemWatcher fsw = new FileSystemWatcher();
fsw.Path = @"C:\DataIN";
fsw.Filter = "*.txt";
fsw.Created += new FileSystemEventHandler(fsw_Created);
fsw.EnableRaisingEvents = true;

// Es funktioniert auch ohne Schlaufe, also bei beendeten Thread...
//while (!_shouldStop)
//{
// Thread.Sleep(100);
//}
}

void fsw_Created(object sender, FileSystemEventArgs e)
{
File.Move(e.FullPath, @"C:\DataOUT\" + e.Name);
}


Besten Dank
Michael
 

Lesen sie die antworten

#1 Frank Dzaebel
07/03/2009 - 19:32 | Warnen spam
Hallo Michael,

Das heisst, der Thread registriert nur die
Ereignismethode und wird anschliessend gleich beendet.
Wird das Ereignis trotzdem in dem "separaten Thread" ausgeführt?



Ja, in diesem Fall (langlebiger publisher) wird der GC
den publisher (FSW) nicht finalisieren.
Hintergründe hier:

[Is it necessary to explicitly remove event handlers in C# - Stack Overflow]
http://stackoverflow.com/questions/...dlers-in-c



Wie zerstöre ich die Ereignismethode?



Allgemein einfach wieder:
fsw.Created -= new FileSystemEventHandler(fsw_Created);
aufrufen.

Hier aber beachte, dass die FileSystemWatcher-Klasse
von IDisposable erbt. Insofern kannst Du sowieso besser:
fsw.Dispose();
verwenden, um auch alle (auch unmanaged)
Ressourcen freizugeben.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen