UI-Thread verhält sich seltsam

11/12/2007 - 12:12 von Dieter Althaus | Report spam
Guten Tag!

Ich habe in meiner Windows-Applikation ein Fenster mit verschiedenen
Controls, z.B. Grid, ImageList, Labels, etc.

Mit einem FileSystemWatcher-Control überwache ich ein Verzeichnis und möchte
bei Erstellung von Files, diese öffnen und in meinen Controls weiter
verarbeiten.
Also hab ich eine Funktion "LoadFile()", die ich im "OnChanged"-Event des
FileSystemWatcher aufrufe. Das funktioniert natürlich nicht, weil dann ein
anderer Thread auf die UI-Controls zugreift. Also
hab ich das OnChanged-Event so gestaltet:

private void OnChanged(object source, FileSystemEventArgs e)
{
if (this.InvokeRequired)
{
this.Invoke(new EventHandler(LoadFile));
}
else
{
LoadFile(this, new EventArgs());
}
}


Funktioniert auch meistens perfekt. Manchmal aber treten Exceptions auf,
weil angeblich die ImageList, die auf meinem Form enthalten ist, keine
Images enthàlt (die ich aber zur Designzeit eingefügt habe). Manchmal ist
auch das Grid-Control noch "null".
Es sieht so aus, als ob das Form gerade erst geladen/initialisiert wird,
obwohl es in Wirklichkeit schon minutenlang angezeigt wird.

Woher kommt das? Wird beim Zugriff auf das Formular durch einen anderen
Thread das ganze Form erst mal komplett neu in einem anderen Kontext
geladen/initialisiert? Was kann ich dagegen machen?

Vielen Dank!
Dieter
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
11/12/2007 - 12:20 | Warnen spam
Hallo Dieter!

"Dieter Althaus" schrieb:
Ich habe in meiner Windows-Applikation ein Fenster mit verschiedenen
Controls, z.B. Grid, ImageList, Labels, etc.

Mit einem FileSystemWatcher-Control überwache ich ein Verzeichnis und
möchte bei Erstellung von Files, diese öffnen und in meinen Controls
weiter verarbeiten.
Also hab ich eine Funktion "LoadFile()", die ich im "OnChanged"-Event des
FileSystemWatcher aufrufe. Das funktioniert natürlich nicht, weil dann ein
anderer Thread auf die UI-Controls zugreift. Also
hab ich das OnChanged-Event so gestaltet:

private void OnChanged(object source, FileSystemEventArgs e)
{
if (this.InvokeRequired)
{
this.Invoke(new EventHandler(LoadFile));
}
else
{
LoadFile(this, new EventArgs());
}
}




Das sollte funktionieren (d.h., ich kann das von Dir beschriebene Phànomen
nicht erklàren). Du kannst den Code aber noch verkürzen, indem Du das
Formular/Steuerelement der Eigenschaft 'SynchronizingObject' des
FileSystemWatchers zuweist und dann direkt auf die Steuerelemente zugreifst.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen