WinRT CoreDispatcher RunAsync和闭包

时间:2014-11-20 23:42:48

标签: c# windows-runtime dispatcher synchronizationcontext

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更改通知时,编译器会在后台分配一个新类,这对很多通知来说都很糟糕。这使得回退到SynchronizationContext.Post,这是一个更有效的选项,当有很多通知时,考虑到它有一个状态变量,处理程序和propertyName可以一起传递。

非常感谢有关如何在此方案中使用Dispatcher的任何建议或想法。

1 个答案:

答案 0 :(得分:1)

我认为你不必担心它。使用封闭可能会很好;我怀疑你会发现任何显着的性能下降。

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

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

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

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