c# - Реальные примеры Rx




.net asynchronous system.reactive (6)

Возможный дубликат:
Хороший пример использования реактивных расширений

Я играю с Reactive Extension в течение некоторого времени, но в основном ограничивается обработкой / составлением пользовательских событий в интерфейсе WPF.

Это такой мощный, новый способ делать асинхронное программирование, и мне любопытно, что с ним делают другие люди, и как вы думаете, что это может улучшить то, как мы сейчас делаем?


Answers

Я использовал RX для реализации загрузки данных в куски (например, студия управления сервером sql). Использование реактивных расширений для потоковой передачи данных из базы данных


Я написал более полную библиотеку для интеграции WPF / Silverlight и Rx, документация (EDIT: no longer lousy!) Прямо сейчас, но вы можете проверить ее:

http://www.reactiveui.net


Мы успешно используем Rx при загрузке данных из бэкэнд в приложении Silverlight. Недавно мы перенесли из SOAP-сервиса простое генерирование XML на сервере, и Rx пришел как раз вовремя, чтобы мы могли использовать его вместо WebClient или WebRequest (фактически мы теперь переносим WebClient в Observable, но, вероятно, перейдем к WebRequest).

У нас была ошибка пару дней назад; мы поняли, что URL-адреса запросов были настолько длинными, что они были усечены. К счастью, мы можем разделить запрос на несколько и объединить ответы, но решить, что использование только WebClient означало бы создание очереди и конечного автомата для обработки запросов последовательно ... Вместо этого, используя Rx, мы могли бы просто разделить запрос в группах , делайте то, что мы делали раньше, но в призыве SelectMany, и мы закончили! Rx на помощь!


У Сэмюэла МакАрэйва есть видео на Channel9, описывающее приложение SilverLight реального мира, которое он создал с помощью RX. Он даже сделал его доступным на CodePlex .

Кроме того, вот несколько практических применений, когда вы можете применять RX, даже если у вас нет асинхронных требований:

  • Если вы хотите разрешить пользователю прокручивать список, отображающий некоторые детали сбоку, то запрос на детали синхронно может повредить вашу производительность прокрутки. .Throttle () - ваш друг здесь.
  • Иногда вам нужно выполнить поиск, как только пользователь перестанет печатать . То же самое, используйте .Throttle, и вы в порядке.
  • Используйте Routed Commmands в MVVM . Очень приятно использовать элементы списка, просто укажите CommandParameter = "{Binding}", и вы можете поймать их на уровне контейнера .

Вероятно, мое любимое решение прямо сейчас для Rx - использовать его как агрегатор событий. Посмотрите здесь:

http://jfromaniello.blogspot.com/2010/04/event-aggregator-with-reactive.html

Я адаптировал это для Silverlight, и это работает как шарм. Что удивительно мощно, так это способность фильтровать события. Для примера одно событие просто набирает «строка», потому что другой информации нет. Вместо создания строго типизированного класса для каждого простого события я создал класс, который предоставляет константы (поэтому нет магических строк), например BEGIN_BUSY (при вызове веб-службы), END_BUSY (когда это делается), и т.п.

Чтобы подписаться, вы можете буквально сделать:

(from e in EventAggregator.Subscribe<string>() where e.Equals(BEGIN_BUSY) select true).Subscribe( evt=> { // Listening only to the BEGIN_BUSY event }); 

Любить это!


Событие AppDomain.UnhandledException

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

   public App()
   {
      AppDomain currentDomain = AppDomain.CurrentDomain;
      currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);    
   }

   static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
   {
      Exception e = (Exception) args.ExceptionObject;
      Console.WriteLine("MyHandler caught : " + e.Message);
      Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
   }

Если событие UnhandledException обрабатывается в домене приложения по умолчанию, он создается там для любого необработанного исключения в любом потоке независимо от того, в какой домен приложения был запущен поток. Если поток запущен в домене приложения, который имеет обработчик событий для UnhandledException, событие возникает в этом домене приложения. Если этот домен приложения не является доменом приложения по умолчанию, а также есть обработчик событий в домене приложения по умолчанию, событие создается в обоих доменах приложений.

Например, предположим, что поток начинается в домене приложения «AD1», вызывает метод в домене приложения «AD2», и оттуда вызывается метод в домене приложения «AD3», где он выдает исключение. Первым доменом приложения, в котором может быть поднято событие UnhandledException, является «AD1». Если этот домен приложения не является доменом приложения по умолчанию, это событие также может быть поднято в домене приложения по умолчанию.





c# .net asynchronous system.reactive