1

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 的建议或想法将不胜感激。

4

1 回答 1

1

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

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

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

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

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

于 2014-11-21T00:20:33.397 回答