2012-05-30 2 views
1

Привет всем мой простой код выглядит как этогоWPF: Раскадровка объект цикла принадлежит другому потоку

private void flipForeverever(object sender, EventArgs args) 
    { 


      moveYs = new DoubleAnimation(); 
      m2oveYs = new DoubleAnimation(); 

      try 
      { 
       sf.Remove(this); 
       sf.Children.Clear(); 

      } 
      catch (Exception e) 
      { 

      } 

      if (firstPanelAngle == 360) 
      { 
       moveYs.To = 180; 
       moveYs.From = 0; 
      } 
      else 
      { 
       moveYs.To = 360; 
       moveYs.From = 180; 
      } 




      if (secondPanelAngle == 360) 
      { 
       m2oveYs.To = 180; 
       m2oveYs.From = 0; 
      } 
      else 
      { 
       m2oveYs.To = 360; 
       m2oveYs.From = 180; 
      } 



      sf = (Storyboard)FindResource("Storyboard1"); 
      Storyboard.SetTargetName(moveYs, "rotatePanel"); 
      Storyboard.SetTargetProperty(moveYs, new           thisPropertyPath(AxisAngleRotation3D.AngleProperty)); 

      Storyboard.SetTargetName(m2oveYs, "rotateSecond"); 
      Storyboard.SetTargetProperty(m2oveYs, new PropertyPath(AxisAngleRotation3D.AngleProperty)); 

      sf.Children.Add(moveYs); 
      sf.Children.Add(m2oveYs); 
      // sf.RepeatBehavior = RepeatBehavior.Forever; 

      if (flipForever) 
      { 
      sf.Completed += new EventHandler(delaythespin); 

       sf.Begin(this); 




     } 
    } 

    private void delaythespin(object sender, EventArgs args) 
    { 
     sf.Stop(this); 

     System.Timers.Timer timer = new System.Timers.Timer(500); 
     timer.Elapsed += new System.Timers.ElapsedEventHandler(flipForeverever); 

     timer.Enabled = true; 
     firstPanelAngle = rotatePanel.Angle; 
     secondPanelAngle = rotateSecond.Angle; 
     timer.Start(); 


    } 

Поэтому в основном я называю flipForeverever через клик вызов и предполагается петля навсегда, пока я не установлен flipforever лжи. .. Но тогда это дает мне эту ошибку ...

Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток.

Любая помощь будет действительно оценили

ответ

3

Это звучит, как вы могли бы быть с thread affinity проблемы. Вы пробовали использовать DispatcherTimer вместо System.Timers.Timer?

private DispatcherTimer _timer; 

private void GoButton_Click(object sender, RoutedEventArgs e) 
{ 
    _timer = new DispatcherTimer();    // create timer 
    _timer.Interval = new TimeSpan(0, 0, 1);  // tick every 1s 
    _timer.Tick += new EventHandler(_timer_Tick); // method to call 
    _timer.Start();        // start timer 
} 

void _timer_Tick(object sender, EventArgs e) 
{ 
    // we should be on the correct thread now 
    GoButton.Background = Brushes.Aqua; 
} 

Или, если вам нужно использовать System.Timers.Timer, используйте Invoke или BeginInvoke, чтобы попасть на нужную цепочку после пожаров таймера?

private System.Timers.Timer _timer; 

private void GoButton_Click(object sender, RoutedEventArgs e) 
{ 
    _timer = new System.Timers.Timer(1000); 
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
    _timer.Start(); 
} 

void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    // use Dispatcher.Invoke on the UI object that you want to modify 
    // to get on the correct thread for that UI object 
    GoButton.Dispatcher.Invoke((ThreadStart)(() => 
    { 
     GoButton.Background = Brushes.Aqua; 
    })); 
} 
+0

Можете ли вы дать мне пример, потому что я очень ценю, что –

+0

@ user1423316: Конечно, я добавил несколько примеров. –