1

こんにちは、私の単純なコードはすべて次のようになります

    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をfalseに設定するまで永遠にループするはずです...しかし、それは私にこのエラーを与えています...

別のスレッドがこのオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。

どんな助けでも本当に感謝します

4

1 に答える 1

3

スレッド アフィニティの問題が発生している可能性があります。System.Timers.Timerの代わりにDispatcherTimerを使用してみましたか?

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;
    }));
}
于 2012-05-30T01:52:29.567 に答える