Ich hab definitiv falsch ausgelagert. Ich gehe so vor (sorry, dass ich keinen realen Code poste, aber das wäre auf die Schnelle zu unübersichtlich):
BackgroundWorker bw;
Timer timer;
private void timer_Tick(...)
{
bw.RunWorkerAsync();
}
private void bw_DoWork(...)
{
foreach(MyUserControl myControl in (MyUserControl)StackPanel.Children)
{
myControl.DoSomethingWithSound();
}
}
Mir ist jetzt natürlich auch klar, dass lediglich der einzelne Methodenaufruf meiner UserControls in einem separaten Thread durchgeführt wird, allerdings läuft der Timer an sich ja im MainThread. Genau das ist wahrscheinlich hier auch das Problem. Die Timerausführung kann behindert erden, wenn ich die Oberfläche scrolle. Wie könnte ich aber auch die Timerausführung auslagern?