Можно ли заменить традиционную обработку событий в C # на новую платформу Reactive? - PullRequest
7 голосов
/ 23 августа 2009

Все примеры на System.Reactive.dll, которые я видел до сих пор, касаются событий, EventArgs и EventHandlers, мне интересно, может ли кто-нибудь показать мне пример, где уведомление о событии обрабатывается без этого.

Например, в Microsoft XNA Framework у вас есть статический метод Mouse.GetState (), который будет возвращать текущий MouseState (с помощью mouseState.LeftButton == ButtonState.Pressed вы можете увидеть, например, нажата ли левая кнопка, например). ). Таким образом, в первую очередь нет EventArgs, Events и т. Д., И я думаю, что это могло бы послужить примером достижения уведомления о событии без представления концепции события вообще.

Может ли System.Reactive помочь здесь? Может кто-нибудь обернуть это в пример с System.Reactive?

Ответы [ 3 ]

3 голосов
/ 23 августа 2009

Цитата из статьи , которую я нашел полезной:

В C # программист использует реактивное программирование всякий раз, когда он определяет обратный вызов для асинхронная операция или обработчик для события. Когда асинхронный операция заканчивается или когда обрабатывается событие происходит, метод получает называется и исполняется как реакция на событие.

Mouse.GetState() - это метод, который получает текущее состояние мыши. Реактивное программирование было бы полезно, если вы пытались непрерывно обрабатывать (реагировать на) изменения состояния мыши.

Например, вы можете создать оболочку, которая непрерывно опрашивает состояние мыши, а затем уведомляет своих наблюдателей (по сути, возвращаясь к публикации событий здесь). Затем вы можете написать код для обработки этих обновлений (реагировать на них).

2 голосов
/ 23 августа 2009

Опрос состояний мыши или клавиатуры работает в игре, где у вас есть прямой доступ к методам обновления, которые являются пульсом приложения. Метод обновления - это ваше событие, которое вызывается и передается многим объектам, мало чем отличаясь от MouseDown. Так что даже здесь вы полагаетесь на паттерн наблюдателя.

0 голосов
/ 17 ноября 2009

Вы можете создавать Observables из существующих событий. Вы можете использовать Observable.FromEvent для этой цели. Вы можете написать обертку события GetMouseDown, например, как метод расширения для элемента пользовательского интерфейса.

 public static IObservable<Event<MouseButtonEventArgs>> 
                                      GetMouseDown (this UIElement el)
    {                        
        var allevents = Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>
            (   h => new MouseButtonEventHandler(h), 
                h => el.MouseDown += h, 
                h=> el.MouseDown -= h
             );

        return allevents;            
    }   

И позже вы можете «обработать» ваше мероприятие полностью декларативным способом. Как

//create an observable declaratively
var mouseDowns=button.GetMouseDown(); 
//subcribe and do what ever you need
mouseDowns.Subscribe(arg=> MessageBox.Show(arg.ClickCount.ToString()) ); 

А вот как создать наблюдаемое «перетаскивание» с начальной позицией и текущей позицией.

  //Get the initial position and dragged points using LINQ to Events
            var mouseDragPoints = from md in e.GetMouseDown()
                                  let startpos=md.EventArgs.GetPosition(e)
                                  from mm in e.GetMouseMove().Until(e.GetMouseUp())
                                  select new
                                  {
                                      StartPos = startpos,
                                      CurrentPos = mm.EventArgs.GetPosition(e),
                                  };


 //And subscribe here to mouseDragPoints

Прочтите эту статью LINQ to Events - Подробнее о .NET Reactive Extensions и играйте с исходным кодом.

...