【发布时间】:2015-10-07 21:46:50
【问题描述】:
我试图为WPF 中的一些内容设置动画,并在动画完成后运行其他一些操作。
另外,想避免动画结束回调机制,所以想出了如下代码所示的解决方案:
// Start one second of animation
...
// Pause for one second
Wait(this.Dispatcher, 1000);
// Continue and do some other stuff
...
现在,有趣的部分是 Wait 方法,它神奇地在我的代码中使阻塞暂停但动画和 UI 保持正常、响应:
public static void Wait(Dispatcher Dispatcher, int Milliseconds)
{
var Frame = new DispatcherFrame();
ThreadPool.QueueUserWorkItem(State =>
{
Thread.Sleep(Milliseconds);
Frame.Continue = false;
});
Dispatcher.PushFrame(Frame);
}
我已经阅读了有关 DispatcherFrame 的文档和几篇文章,但我仍然无法弄清楚幕后到底发生了什么,我需要澄清一下 PushFrame 的这种构造如何真正起作用。
【问题讨论】:
-
您是否还阅读了Dispatcher.PushFrame 中的备注部分?我猜它解释了一切。
-
是的,我已经读过,但仍不清楚。 Dispatcher 是一个接一个地循环初始 Frame(在启动时创建)和我的 Frame,还是只循环我的 Frame?
-
另外,当我将
PushFrame设置为Contionue到false时会发生什么 -
PushFrame“进入执行循环”(MSDN)。只要其 Continue 属性为真,该循环(即 DispatcherFrame)就会执行。一旦 Continue 属性变为 false,就会退出循环/帧,并且 Dispatcher 返回到它在调用 PushFrame 之前执行的循环/帧。
-
太好了,这是我的假设之一,也在反汇编代码中检查过,看起来像这样。现在,我非常清楚发生了什么。请写上之前的评论作为答案,我会接受的。非常感谢!