WPF problem z wątkami

0

Witam, napotkałem problem z wątkiem. Nie mogę uzyskać dostępu do stworzonego canvasa, mimo odwoływania się do niego przez Dispatcher.Invoke(). Wyrzucany jest wyjątek. Co ciekawe, kilka linijek wyżej, w tym samym wątku odwołuję się do tego samego canvasa i w tym przypadku działa bez zarzutu.

Czesc kodu:

public MainWindow()
{
     InitializeComponent();
     Thread thread = new Thread(Radar);
      thread.SetApartmentState(ApartmentState.STA);
      thread.Start();
}
void Radar()
{
      while (true)
      {
         Thread.Sleep(TimeSpan.FromSeconds(1));
          myCanvas.Dispatcher.Invoke(() => { myCanvas.Children.Clear(); });
          foreach(Vehicle v in Vehicles)
          {
              v.moveVehicle(5);
           }

           foreach(Vehicle v in Vehicles)
           {
              if(v is Aeroplane)
                 {
                   Image icon = new Image();
                   icon.Source = new BitmapImage(new Uri(@"F:\PO Projekt\Flight Control\Flight Control\aeroplane.png"));
                   myCanvas.Dispatcher.Invoke(() => { myCanvas.Children.Insert(0, icon); });   //Tutaj pojawia sie blad
                   Canvas.SetTop(icon, v.getPosition().y);
                   Canvas.SetLeft(icon, v.getPosition().x);
                  }
            }
      }
}

Stos wyjątku:

Wystąpił wyjątek System.InvalidOperationException
  HResult=0x80131509
  Message=Wątek wywołujący nie może uzyskać dostępu do tego obiektu, ponieważ należy on do innego wątku.
  Source=<Nie można ocenić źródła wyjątku>
  Ślad stosu:
   w System.Windows.Threading.Dispatcher.VerifyAccess()
   w System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent)
   w System.Windows.FrameworkElement.AddLogicalChild(Object child)
   w System.Windows.Controls.UIElementCollection.InsertInternal(Int32 index, UIElement element)
   w System.Windows.Controls.UIElementCollection.Insert(Int32 index, UIElement element)
   w Flight_Control.MainWindow.<>c__DisplayClass7_0.<Radar>b__1() w F:\PO Projekt\Flight Control\Flight Control\MainWindow.xaml.cs:wiersz 254
   w System.Windows.Threading.DispatcherOperation.InvokeDelegateCore()
   w System.Windows.Threading.DispatcherOperation.InvokeImpl()

Proszę o pomoc, będę wdzięczny. :)

1

Odpalasz wszystko w nowym wątku a UI działa na głównym. Wszystko odpal w głównym wątku a te które mają być robione asynchronicznie (małe części) odpal osobno

1

I dlaczego używasz Threadów a nie Tasków ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1