| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

ich hab einen System.Timers.Timer der irgendwann triggert. Daraufhin soll im UI ein Label etwas anzeigen. Doch der direkte Aufruf über den Eventhandler klappt nicht:

System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += new ElapsedEventHandler(Execute);
timer.Interval = 5000;
timer.Enabled = true;


public void Execute()
{
myLabel.Content = "Timer abgelaufen";
}



Leider klappt das so nicht. Weil der Timer auf einem anderen Thread läuft, gibt es beim Zugriff auf das Control eine Exception. Frage: Wie muss ich Execute aufrufen, dass die Methode Zugriff auf das UI erhält?

Danke.
News:
18.01.2013
Berndddd 33 1 5
2 Antworten
1
Dazu musst Du den Dispatcher des UI Threads bemühen.

Im einfachsten Fall geht das für Dein Beispiel so:
public void Execute()
{
myLabel.Dispatcher
.Invoke(new Action(() => myLabel.Content = "Timer abgelaufen"));
}
18.01.2013
ffordermaier 8,4k 3 9
Wenn mehrere Controls betroffen sind dann auch immer über deren Dispatcher?
Berndddd 18.01.2013
Entweder das, oder Du benutzt immer den Dispatcher des Fensters oder Du Du rufst im UI Thread einmal "Dispatcher.CurrentDispatcher" auf und speicherst Dir dieses Objekt irgendwo ab (Member, ...) - für die spätere Nutzung.
ffordermaier 18.01.2013
Das klappt, das klappt. Super. Vielen Dank.
Berndddd 18.01.2013
0
Für Windows Forms:

Zum Beispiel so. Wobei "this" auf das aktuelle Form verweist.

if (this.InvokeRequired){
this.BeginInvoke((MethodInvoker)delegate{
myLabel.Content = "Timer abgelaufen";
});
}


Ausführlicher:

public partial class UIThread : Form{

public void startWorkerThread(){
worker = new Worker();
worker.ProgressChanged += new EventHandler<ProgressChangedArgs>(OnWorkerProgressChanged);
workerThread = new Thread(new ThreadStart(worker.StartWork));
workerThread.Start();
}

private void OnWorkerProgressChanged(object sender, ProgressChangedArgs e){
if (this.InvokeRequired){
this.BeginInvoke((MethodInvoker)delegate{
OnWorkerProgressChanged(sender, e);
});
return;
}

this.label1.Text = e.Progress;
}
}
18.01.2013
Floyd 14,6k 3 9
@Floyd: Dein Beispiel sieht mir nach WinForms aus. Berndddd fragt nach WPF.
ffordermaier 18.01.2013
Stimmt sorry, mein Fehler.
Floyd 18.01.2013
Kein Thema. Ich habs noch dazu geschrieben.
ffordermaier 18.01.2013

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH