none
Application.Current.Windows von anderem Thread RRS feed

  • Frage

  • Hallo zusammen.

    Ich habe folgendes Problem:

    Ich sollte  Application.Current.Windows innerhalb eines Timers verwenden. Leider tritt eine Exception auf, dass von dem Thread in dem der Timer läuft nicht darauf zugegriffen werden kann. Kann mir jemand einen Tip geben, wie ich das lösen könnte? - Besten Dank.

    Viele Grüsse, Thomas

    Freitag, 5. November 2010 22:25

Antworten

  • Hallo Thomas,

    auch in WPF gilt die Standard-Windows-Richtlinie:

    [Bearbeiten von Steuerelementen aus Threads]
    http://dzaebel.net/ControlInvoke.htm

    Insofern in WPF in diesem Szenario über den Dispatcher zugreifen:

    [Working With The WPF Dispatcher | Switch on the Code]
    http://www.switchonthecode.com/tutorials/working-with-the-wpf-dispatcher

    oder mal als Code:

      public MainWindow()
      {
       InitializeComponent();
       Thread thread = new Thread(new ThreadStart(ThreadMethod));
       thread.Start();
      }
    
      void ThreadMethod()
      {
       Dispatcher.Invoke(DispatcherPriority.Normal,
         new Action<string>(Test), "aus anderem Thread: ");
      }
    
      void Test(string info)
      {
       var wins = Application.Current.Windows;
       for (int i = 0; i < wins.Count; i++)
        MessageBox.Show(info + wins[i].Title); 
      }
    

    ciao Frank
    • Als Antwort markiert Kehl Thomas Montag, 8. November 2010 07:37
    Sonntag, 7. November 2010 20:38

Alle Antworten

  • Hallo Thomas,

    auch in WPF gilt die Standard-Windows-Richtlinie:

    [Bearbeiten von Steuerelementen aus Threads]
    http://dzaebel.net/ControlInvoke.htm

    Insofern in WPF in diesem Szenario über den Dispatcher zugreifen:

    [Working With The WPF Dispatcher | Switch on the Code]
    http://www.switchonthecode.com/tutorials/working-with-the-wpf-dispatcher

    oder mal als Code:

      public MainWindow()
      {
       InitializeComponent();
       Thread thread = new Thread(new ThreadStart(ThreadMethod));
       thread.Start();
      }
    
      void ThreadMethod()
      {
       Dispatcher.Invoke(DispatcherPriority.Normal,
         new Action<string>(Test), "aus anderem Thread: ");
      }
    
      void Test(string info)
      {
       var wins = Application.Current.Windows;
       for (int i = 0; i < wins.Count; i++)
        MessageBox.Show(info + wins[i].Title); 
      }
    

    ciao Frank
    • Als Antwort markiert Kehl Thomas Montag, 8. November 2010 07:37
    Sonntag, 7. November 2010 20:38
  • Hallo Frank

    Vielen Dank für deinen Tip. Irgendwie bin ich bis anhin immer davon ausgegangen, dass dieser Aufruf mittels Dispatcher asynchron zum Aufrufer abläuft. Hab nun aber deinen Code diesbezüglich getestet und festgestellt, dass dem nicht so ist.

    Viele Grüsse, Thomas

    Montag, 8. November 2010 07:37