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)));
            }
    }

現在、単純なプロップ変更通知が呼び出されるたびに、舞台裏でコンパイラによって新しいクラスが割り当てられますが、これは多くの通知にとってひどいことです。これにより、SynchronizationContext.Post にフォールバックします。これは、ハンドラーに状態変数があり、propertyName を一緒に渡すことができることを考慮すると、多くの通知がある場合により効率的なオプションです。

このシナリオで Dispatcher を使用する方法についての提案や考えは大歓迎です。

4

1 に答える 1

1

気にする必要はないと思います。クロージャーを使用することはおそらく問題ありません。大幅なパフォーマンスの低下が見られるとは思えません。

呼び出されたメソッドにパラメーターを渡すことができる他の場合でも、割り当てが発生することに注意してください。少なくとも、object[]パラメータを格納するために を割り当てる必要があります。さらに、値型パラメーターはボックス化する必要があり、より多くの割り当てが必要になります。

したがって、クロージャーは最悪でも同じであり、シナリオによっては、値の型をボックス化する必要がないため、割り当てに関してより効率的になる可能性があるように思えます。

予想に反して、割り当てによってパフォーマンスが低下するシナリオに陥った場合は、独自のクロージャーを明示的に実装して、インスタンスを再利用できます。つまり、明示的に使用されるクラスを作成します。このクラスには、通常キャプチャされる変数が含まれ、実行するコードが含まれます。次に、それらの 1 つ (またはプール内の複数) を割り当て、呼び出しごとにインスタンスを再利用します。

しかし、実際には、そのすべての問題に取り組むやむを得ない理由を見つけることはできないと思います。

于 2014-11-21T00:20:33.397 に答える