como fazer eventos DispatcherTimer mais suave no WPF?

No meu aplicativo WPF, o usuário pressiona um botão para iniciar um modelo 3D girando suavemente e solta o botão para interromper a rotação.

Para fazer isso, eu crio um DispatcherTimer:

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

E quando o botão é pressionado eu chamotimer.Start() e quando o botão é deixar eu chamotimer.Stop().

otimer_Tick função altera a rotação do modelo:

    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;
    }

O que eu noto é que o modelo gira suavemente na maior parte, mas geralmente congela e gagueja, parando por várias durações, às vezes até 1/4 de segundo.

Existe uma maneira de tornar isso mais suave? Eu entendo que, usando DispatcherTimer (em oposição a, digamos, System.Timers.Timer) os retornos de chamada acontecem no thread da interface do usuário. Mas é necessário que eu esteja na ameaça da interface do usuário para executar a linha

        model2.Transform = rotate;

Eu li sobre várias maneiras de obter um retorno de chamada do temporizador em algum outro segmento. Mas parece que no final eu tenho que sincronizar com o thread da interface do usuário para chamar essa linha. Se eu usar Invoke () para empacotar, digamos, o thread de retorno de chamada System.Timers.Timer para o segmento de interface do usuário, isso dará uma animação geral mais suave? Parece que não deveria, já que é necessário sincronizar com o thread da interface do usuário, assim como o DispatcherTimer presumivelmente faz. E para esse assunto parecequalquer esquema para definirmodel2.Transform em um intervalo regular seria no mesmo barco em relação ao segmento de interface do usuário, não?

(Como uma questão talvez secundária, estou tentando entender o que está causando as pausas. Até onde eu sei, não há nada mais significativo que a thread da interface do usuário esteja fazendo. Então, eu não entendo o que está acontecendo Pausas. Coleta de lixo? Não parece que deveria haver muito lixo para colecionar, e não parece que a pausa seria tão extrema.

questionAnswers(1)

yourAnswerToTheQuestion