我想知道以下代码是否会带来任何性能提升:
if (Deployment.Current.Dispatcher.CheckAccess())
{
DoUIWork();
}
else
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
DoUIWork());
}
Dispatcher是否足够聪明,如果没有必要,可以将调度短路到UI线程?
答案 0 :(得分:0)
与检查相比,我无法说出调度程序在从UI线程调度到自身时是否做了任何昂贵的事情。但是UI线程中的BeginInvoke可能与直接执行操作的行为不同,因为它至少会放入队列而不是立即调用。如果之后直接使用了代码,您可以区分它并删除条件语句。
当然值得了解控制流程,足以知道差异是否重要。
答案 1 :(得分:0)
如果它类似于标准的Windows SynchronizationContext(可能是),那么这两个选项就不一样了。在处理完当前执行任何现有消息之后,BeginInvoke将基本排队由调度程序消息泵执行的方法。 在您的示例中,如果您使用Invoke而不是BeginInvoke,则两个选项相同。