在Silverlight中调用Dispatcher.CheckAccess()是否良好?

时间:2011-10-31 00:51:00

标签: c# multithreading silverlight user-interface dispatcher

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

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

Dispatcher是否足够聪明,如果没有必要,可以将调度短路到UI线程?

2 个答案:

答案 0 :(得分:0)

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

当然值得了解控制流程,足以知道差异是否重要。

答案 1 :(得分:0)

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