как сделать события DispatcherTimer более плавными в WPF?

В моем приложении WPF пользователь нажимает кнопку для плавного вращения 3D-модели и отпускает кнопку, чтобы остановить вращение.

Для этого я создаю DispatcherTimer:

DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler( timer_Tick );
timer.Interval = new TimeSpan( 0, 0, 0, 0, 30 );

И когда кнопка нажата, я звонюtimer.Start() и когда кнопка отпущена, я звоню.timer.Stop()

timer_Tick Функция изменения поворота модели:

    void timer_Tick( object sender, EventArgs e )
    {
        spin = ( spin + 2 ) % 360;
        AxisAngleRotation3D rotation = new AxisAngleRotation3D( new Vector3D( 0, 1, 0 ), spin );
        Transform3D rotate = new RotateTransform3D( rotation );
        model2.Transform = rotate;
    }

Что я заметил, так это то, что модель вращается в большинстве случаев плавно, но часто зависает и заикается, делая паузу в течение разных периодов времени, иногда до 1/4 секунды.

Есть ли способ сделать это более гладким? Я понимаю, что с помощью DispatcherTimer (в отличие, скажем, от System.Timers.Timer) обратные вызовы происходят в потоке пользовательского интерфейса. Но это'Мне необходимо быть под угрозой пользовательского интерфейса, чтобы запустить линию

        model2.Transform = rotate;

Я читал о различных способах получения обратного вызова таймера в другом потоке. Но, похоже, в конце концов мне нужно синхронизироваться с потоком пользовательского интерфейса, чтобы вызвать эту строку. Если я использую Invoke () для маршалинга, скажем, из потока обратного вызова System.Timers.Timer в поток пользовательского интерфейса, это даст более плавную анимацию? Кажется, это не должнот, так как этонеобходимо синхронизировать с потоком пользовательского интерфейса точно так же, как это делает DispatcherTimer. И в этом отношении кажется, чтолюбой схема для настройкиmodel2.Transform на регулярной основе будет в той же лодке по отношению к потоку пользовательского интерфейса, нет?

(Как возможно вторичный вопрос, япытаюсь понять чтоS вызывает паузы в первую очередь. Насколько я знаю, тамНичего более существенного, что делает поток пользовательского интерфейса. Так что я нене понимаю, чтопроисходит во время этих пауз. Вывоз мусора? Это нене должно быть много мусора, и это некажется, что пауза была бы такой чрезвычайной.)

Ответы на вопрос(1)

Ваш ответ на вопрос