【问题标题】: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,则这两个选项是相同的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 2022-09-28
        • 2011-10-04
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        相关资源
        最近更新 更多