AdSense

Montag, 2. September 2013

C# WPF - Invoken

(English version) Im vorigen Post taucht das Problem auf: Ich darf auf bestimmte Grafik-Sachen nur aus dem Haupt-Thread zugreifen. Dummerweise kann es jedoch immer vorkommen, dass man auch aus einem anderen Thread etwas tun will. Die Lösung dafür heißt: Invoken. Wie das geht zeige ich nun. Zuerst ein Beispiel, wie etwas nicht funktioniert:

void threadActivity()
{
    Thread.Sleep(5000);
    TaskbarItemInfo.ProgressValue = 0.2;
}


Sobald 5 Sekunden um sind wird ein Fehler auftreten: InvalidOperationException wurde nicht behandelt. Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet. Wie schon angekündigt heißt die Lösung hierfür: Invoken. Der veränderte Code sieht nun folgendermaßen aus:

void threadActivity()
{
    Thread.Sleep(5000);
    Application.Current.Dispatcher.BeginInvoke(new Action(() =>
    {
        TaskbarItemInfo.ProgressValue = 0.2;
    }));
}


Sobald nun 5 Sekunden um sind wird sich der Fortschrittsbalken in der Taskleiste auf den Wert 0.2 einstellen. Zur Syntax: alles in den inneren geschweiften Klammern wird im Haupt-Thread ausgeführt, innerhalb der Klammern kann man auf Variablen, auf welche man außerhalb der geschweiften Klammern zugreifen kann, auch zugreifen. Auch darf ruhig deutlich mehr als nur ein Befehl darin stehen (wobei es ratsamer ist, nur möglichst kurze Code-Bausteine zu invoken).

4 Kommentare:

  1. Hallo Udo. Danke für diesen Post. Hat mir gerade echt weitergeholfen!

    Gruß

    AntwortenLöschen
  2. Auch Heute hat dein Eintrag weitergeholfen...

    Danke

    AntwortenLöschen
  3. Auch heute mal wieder. Dankeschön!

    AntwortenLöschen
  4. Danke. Hat schon wieder weitergeholfen!

    AntwortenLöschen