5

Reactive Extensions for .NET を使用する WPF アプリケーションに次のコードがあります。

public MainWindow()
{
    InitializeComponent();

    var leftButtonDown = Observable.FromEvent<MouseButtonEventArgs>(this, "MouseLeftButtonDown");
    var leftButtonUp = Observable.FromEvent<MouseButtonEventArgs>(this, "MouseLeftButtonUp");

    var moveEvents = Observable.FromEvent<MouseEventArgs>(this, "MouseMove")
        .SkipUntil(leftButtonDown)
        .SkipUntil(leftButtonUp)
        .Repeat()
        .Select(t => t.EventArgs.GetPosition(this));

    moveEvents.Subscribe(point =>
    {
        textBox1.Text = string.Format(string.Format("X: {0}, Y: {1}", point.X, point.Y));
    });
}

マウスがこのダイアログ上を移動している間、メモリは着実に増加しますか?

コードを読むと、moveEvents オブザーバブルには、しばらくすると大量の MouseEventArgs が含まれると思いますか? それとも、これは私が気付いていないスマートな方法で処理されていますか?

4

1 に答える 1

8

いいえ、メモリ使用量が着実に増加することはありません。なぜでしょうか? イベントは基本的にサブスクライバーにストリーミングされます。それらはどこにもバッファリングされていません。

Rx のポイントは、イベントがサブスクライバーにプッシュされ、サブスクライバーがそれらをどう処理するかを選択できることです。イベントをリストに追加して後で調べるようなものではありません。

(Rx でイベントをバッファリングする方法はありますが、私が知る限り、それらを使用していません。)

于 2010-06-14T20:31:19.860 に答える