У меня есть приложение Silverlight 3, которое отлично работает, за исключением 4 машин. DispatcherTimer и раскадровки не работают последовательно на этих 4 машинах. Я создал очень простое тестовое приложение, чтобы попытаться это выяснить, приведу код ниже.
Обычно тестовое приложение обновляет два блока TextBlock каждую секунду. Один использует DispatcherTimer, другой использует анимацию раскадровки. Это прекрасно работает - текстовые поля обновляют «1, 2, 3 ...» каждую секунду. Но на 4 затронутых машинах TextBlocks обновляются не каждую секунду, они обновляются между 27 и 33 секундами. Обновления DispatcherTimer и Storyboard выполняются в одно и то же время.
CPU, Memory, HD все в порядке. Диспетчер задач и SilverlightSpy показывает, что все в порядке. Это все рабочие станции с частотой 3 ГГц и 3 ГБ ОЗУ, на которых больше ничего не работает.
XAML:
<TextBlock Text="0" Name="DispatcherTimerText" Grid.Column="0" />
<TextBlock Text="0" Name="SBLoopTimerText" Grid.Column="1" />
C #:
Storyboard _sbLoop = new Storyboard();
public MainPage()
{
InitializeComponent();
Storyboard_Start();
Timer_Start();
}
void Timer_Start()
{
System.Windows.Threading.DispatcherTimer dt1 = new System.Windows.Threading.DispatcherTimer();
dt1.Interval = new TimeSpan(0, 0, 1); // 1 second
dt1.Tick += new EventHandler(Timer_Tick);
dt1.Start();
}
void Timer_Tick(object sender, EventArgs e)
{
TextBlock txt = ((TextBlock)LayoutRoot.Children.Single(t => ((TextBlock)t).Name == "DispatcherTimerText"));
txt.Text = (int.Parse(txt.Text) + 1).ToString();
}
void Storyboard_Start()
{
_sbLoop.Duration = TimeSpan.FromSeconds(1);
_sbLoop.Completed += new EventHandler(StoryboardLoop);
_sbLoop.Begin();
}
void StoryboardLoop(object sender, EventArgs e)
{
TextBlock txt = ((TextBlock)LayoutRoot.Children.Single(t => ((TextBlock)t).Name == "SBLoopTimerText"));
txt.Text = (int.Parse(txt.Text) + 1).ToString();
_sbLoop.Begin(); // Restart sb animation
}