我见过一些代码示例,其中StoryBoard用作Timer,例如:
void Update()
{
if (_sb == null)
{
_sb = new Storyboard();
_sb.Completed += _sb_Completed;
_sb.Duration = new Duration(TimeSpan.FromSeconds(1));
}
if (_sb_completed)
{
_sb.Begin();
_sb_completed = false;
}
}
void _sb_Completed(object sender, EventArgs e)
{
PerformUpdate();
_sb_completed = true;
}
故事板在某些方面比定时器好吗?为什么人们会使用它?
P.S。问题与Silverlight和/或WPF有关。
答案 0 :(得分:3)
故事板,就像DispatcherTimer一样,在UI线程上运行。因此,无论哪种情况,您都不会看到跨线程异常。
您可以在DispatcherTimer上使用Storyboard,因为Storyboard具有更高的优先级。
但是我不确定Timer对象本身,因为我从来没有真正使用它来支持Storyboard或DispatcherTimer。
答案 1 :(得分:2)
使用Storyboard
与使用标准System.Threading.Timer
不同。 Storybroad
在主线程上运行,因此Completed
甚至可以操作UI元素而不会获得跨线程异常。标准Timer
回调不在UI线程上运行,因此需要额外的帮助来操作UI元素。
然而,正如马克指出,如果所有真正需要的是延迟,那么DispatcherTimer
将是更直观的选择。与DispatcherTimer
的区别在于其设计用于定期调用其Tick
事件,而Storyboard
每次调用Completed
时最多只调用一次Begin
。通过在第一个DispatcherTimer
事件发生时调用Stop
方法,可以以这种方式使用Tick
。