Действительно ли возможно заменить традиционную обработку событий в C# с новой Реактивной платформой?

Иногда это может произойти, что Вы не можете возвратить код ошибки, например, когда Вам нужен точный контекст того, когда ошибочная ситуация произошла, например, когда необходимо распространить ошибочное состояние 3, выравнивает - Вы освобождаете контекст.

В этой ситуации пользовательский класс является лучшим решением. Я использую этот подход, определяя мои собственные встроенные классы (нет никакого .cpp для них; только.h), например:

class DeviceException {
    ;
}

class DeviceIOException: public DeviceException {
    DeviceIOException(std::string msg, int errorCode);
}

и т.д.

я затем могу судить/реагировать исключение по типу и по информации, содержавшей в.

7
задан Ruben Bartelink 11 February 2010 в 10:21
поделиться

3 ответа

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

2
ответ дан 7 December 2019 в 12:23
поделиться

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

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

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

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

3
ответ дан 7 December 2019 в 12:23
поделиться

Вы можете создавать 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 и поиграйте с исходный код.

0
ответ дан 7 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: