【问题标题】:WinRT CoreDispatcher RunAsync and closuresWinRT CoreDispatcher RunAsync 和闭包
【发布时间】:2014-11-20 23:42:48
【问题描述】:

WinRT CoreDispatcher 具有 RunAsync 方法,该方法实际上不采用状态变量。

翻译:在最常见的情况下,通过发布到 Dispatcher 发生的每一个通知最终都会由于关闭而在内部分配。忽略了一个简单而重要的设计,这非常令人担忧。

例如:实现 INotifyPropertyChanged 的​​一个简单的常见示例需要一个方法,最终结果如下:

    protected virtual void NotifyPropertyChanged(
[CallerMemberName] string propertyName = null)
    {
            var handler = PropertyChanged;

            if (handler != null)
            {
                // Check access first, and then at some point pass it along.
                Dispatcher.RunAsync(() => 
    handler(this, new PropertyChangedEventArgs(propertyName)));
            }
    }

现在,每次调用一个简单的 prop changed 通知时,编译器都会在后台分配一个新的类,这对于很多通知来说是可怕的。这使得回退到 SynchronizationContext.Post,这是一个更有效的选择,当有很多通知时,考虑到它有一个状态变量,处理程序和 propertyName 可以一起传递。

任何关于如何在这种情况下使用 Dispatcher 的建议或想法将不胜感激。

【问题讨论】:

    标签: c# windows-runtime dispatcher synchronizationcontext


    【解决方案1】:

    我认为您不必担心。使用闭包可能就可以了。我怀疑你会观察到任何显着的性能下降。

    请注意,在您可以将参数传递给被调用方法的其他情况下,您仍然会得到分配。至少,必须分配一个object[] 来包含参数。此外,值类型参数最终不得不装箱:更多的分配。

    所以在我看来,闭包在最坏的情况下是相同的,并且在某些情况下可以更有效地分配,因为在那种情况下不必对值类型进行装箱。

    如果您确实发现自己处于分配影响性能的情况下,您可以显式实现自己的闭包并重用该实例。 IE。创建一个明确使用的类,其中包含通常会被捕获的任何变量,并且包含您要执行的代码。然后分配其中一个(或几个,在一个池中)并为每次调用重用实例。

    但说真的,我怀疑你会找到一个令人信服的理由来解决所有这些麻烦。

    【讨论】:

    • 我明白你的意思。我想在这种情况下使用游泳池似乎是最好的主意。谢谢,无论出于何种原因都没有想到一个游泳池。我正在查看使用 INotifyPropertyChanged 处理程序提供的日志视图的场景。因此,每秒数百个事件。 :)
    • FWIW,每秒 100 次事件对于现代 PC 和 .NET 来说基本上不算什么。即使是 1000/秒也不会对计算机征税。以这样的速度,我几乎可以保证您不会因为使用闭包来处理每个事件而遇到任何重大的性能问题。
    • 毫无疑问,即使是数千个事件也算不了什么。但它只是记录器。记录 100 条事件意味着 100 条征税操作已经在运行。 :) 无论如何,通用对象状态仍然会更有效。由于 Action, T 状态,结合用于多个参数的类似 Tuple 的结构应该在堆上零分配的情况下完成。如果只是。
    • “记录 100 多个事件意味着已经有 100 个征税操作在运行。” 这只是强化了我的观点。在这些事件的上下文中,单个分配(以及最终的收集......分配本身实际上是免费的,而成本,无论多么无关紧要,在进行 GC 的时候出现)只是无关紧要的事情。请记住,Action<T> 也是一个对象,并且再次传递没有强类型容器的值类型意味着装箱(更多分配)。 .NET 旨在处理大量分配;在你有证据之前不要担心。
    猜你喜欢
    • 2012-05-28
    • 2019-12-18
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2018-07-05
    • 2018-12-11
    相关资源
    最近更新 更多