【问题标题】:Is calling Dispatcher.CheckAccess() good form in Silverlight?在 Silverlight 中调用 Dispatcher.CheckAccess() 是否良好?
【发布时间】:2011-10-31 00:50:59
【问题描述】:
我想知道以下代码是否能带来任何性能提升:
if (Deployment.Current.Dispatcher.CheckAccess())
{
DoUIWork();
}
else
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
DoUIWork());
}
Dispatcher 是否足够聪明,可以在不必要的情况下将调度短路到 UI 线程?
【问题讨论】:
标签:
c#
multithreading
silverlight
user-interface
dispatcher
【解决方案1】:
与检查相比,我不能说调度程序在从 UI 线程调度到自身时是否做任何昂贵的事情。但是来自 UI 线程的 BeginInvoke 的行为可能与直接执行操作不同,因为它至少被放入队列而不是立即调用。如果您之后直接有代码,您可以区分这与删除条件语句之间的区别。
当然值得了解控制流,足以知道差异是否无关紧要。
【解决方案2】:
如果它类似于标准的 Windows SynchronizationContext(并且可能是),那么这两个选项是不一样的。 BeginInvoke 基本上将在处理任何现有消息的当前执行后,将调度程序消息泵执行的方法排队。
在您的示例中,如果您使用 Invoke 而不是 BeginInvoke,则这两个选项是相同的。