2010-06-14 2 views
3

У меня есть следующий код в приложении WPF с помощью Reactive Extensions для .NET:Реактивные расширения использования памяти

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 через некоторое время? Или это обрабатывается каким-то умным способом, о котором я не знаю?

+0

Обратите внимание, что абонент получает только новые события с после того, как он выписывает, поэтому старые события не являются где угодно. – Gabe

ответ

5

Нет, не должно быть постоянного увеличения использования памяти - почему бы и нет? События в основном передаются абоненту; они нигде не буферизуются.

Точка Rx - это то, что события подталкивают подписчику, который может выбрать, что с ними делать. Это не похоже на добавление событий в список, который затем рассматривается позже.

(Есть способы буферизации событий в Rx, но вы их не используете, насколько я могу сказать.)

+0

Спасибо за ваш ответ. Чтобы несколько ответить на ваш вопрос «зачем это было?» - спросил я, потому что я еще не понял, как это работает. Мне не ясно, что происходит в строке Observable.FromEvent (это, «MouseLeftButtonDown»); – OneOfAccount

Смежные вопросы