在Silverlight中调用Dispatcher.CheckAccess()是一种很好的形式



我想知道以下代码是否会带来性能提升:

if (Deployment.Current.Dispatcher.CheckAccess())
{
    DoUIWork();
}
else
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    DoUIWork());
}

Dispatcher是否足够聪明,可以在不必要的情况下短路对UI线程的调度?

与检查相比,我不能说调度程序在从UI线程调度到自身时是否做了任何昂贵的事情。但是来自UI线程的BeginInvoke可能与直接执行操作的行为不同,因为它至少被放在队列中,而不是立即调用。如果后面有代码,可以看出这与删除条件语句之间的区别。

当然值得注意的是控制流程,足以知道是否差异无关紧要。

如果它类似于标准的Windows SynchronizationContext(很可能是),那么这两个选项就不一样了。BeginInvoke基本上会在任何现有消息的当前执行被处理之后,将由调度程序消息泵执行的方法排队。在您的示例中,如果您使用Invoke而不是BeginInvoke,则这两个选项是相同的。

相关内容

最新更新