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. :)