Как я могу узнать, что делает мой запрос на активные запросы?

Я пишу сложный запрос Reactive Extensions с большим количеством операторов. Как я могу посмотреть, что происходит?

Я спрашиваю и отвечаю на это, поскольку он подходит к честной битке и, вероятно, имеет общее общее применение.

Вы можете добавить эту функцию к вашим операторам Rx, пока вы их разрабатываете, чтобы увидеть, что происходит:

public static IObservable Spy(this IObservable source, string opName = null) { opName = opName ?? "IObservable"; Console.WriteLine("{0}: Observable obtained on Thread: {1}", opName, Thread.CurrentThread.ManagedThreadId); return Observable.Create(obs => { Console.WriteLine("{0}: Subscribed to on Thread: {1}", opName, Thread.CurrentThread.ManagedThreadId); try { var subscription = source .Do(x => Console.WriteLine("{0}: OnNext({1}) on Thread: {2}", opName, x, Thread.CurrentThread.ManagedThreadId), ex => Console.WriteLine("{0}: OnError({1}) on Thread: {2}", opName, ex, Thread.CurrentThread.ManagedThreadId), () => Console.WriteLine("{0}: OnCompleted() on Thread: {1}", opName, Thread.CurrentThread.ManagedThreadId) ) .Subscribe(obs); return new CompositeDisposable( subscription, Disposable.Create(() => Console.WriteLine( "{0}: Cleaned up on Thread: {1}", opName, Thread.CurrentThread.ManagedThreadId))); } finally { Console.WriteLine("{0}: Subscription completed.", opName); } }); } 

Вот пример использования, показывает тонкую разницу в поведении Range :

 Observable.Range(0, 1).Spy("Range").Subscribe(); 

Выдает вывод:

 Range: Observable obtained on Thread: 7 Range: Subscribed to on Thread: 7 Range: Subscription completed. Range: OnNext(0) on Thread: 7 Range: OnCompleted() on Thread: 7 Range: Cleaned up on Thread: 7 

Но это:

 Observable.Range(0, 1, Scheduler.Immediate).Spy("Range").Subscribe(); 

Выдает вывод:

 Range: Observable obtained on Thread: 7 Range: Subscribed to on Thread: 7 Range: OnNext(0) on Thread: 7 Range: OnCompleted() on Thread: 7 Range: Subscription completed. Range: Cleaned up on Thread: 7 

Найди отличие?

Очевидно, вы можете изменить это, чтобы записывать в журналы или в Debug, или использовать директивы препроцессора, чтобы сделать постную сквозную подписку на сборку Release и т. Д. …

Вы можете применять Spy всей цепочке операторов. например:

 Observable.Range(0,3).Spy("Range") .Scan((acc, i) => acc + i).Spy("Scan").Subscribe(); 

Выдает вывод:

 Range: Observable obtained on Thread: 7 Scan: Observable obtained on Thread: 7 Scan: Subscribed to on Thread: 7 Range: Subscribed to on Thread: 7 Range: Subscription completed. Scan: Subscription completed. Range: OnNext(1) on Thread: 7 Scan: OnNext(1) on Thread: 7 Range: OnNext(2) on Thread: 7 Scan: OnNext(3) on Thread: 7 Range: OnCompleted() on Thread: 7 Scan: OnCompleted() on Thread: 7 Range: Cleaned up on Thread: 7 Scan: Cleaned up on Thread: 7 

Я уверен, что вы можете найти способы обогащения этого в соответствии с вашими целями.

  • NUnit не запускает код Visual Studio 2010
  • Как я могу отладить мое приложение Meteor с помощью WebStorm IDE?
  • Visual Studio отлаживает инструмент «быстрого просмотра» и lambda-выражения
  • Как фильтровать стек вызовов в представлении отладки Eclipse для Java
  • Какое имя следует отнести к отладке, добавляя выражения «print»
  • Как отлаживать веб-сайты на мобильных устройствах?
  • Как сгенерировать символ отладки gcc вне цели сборки?
  • Автоматическое добавление журналов входа / выхода в проект
  • Как использовать файлы PDB
  • Отладка JBoss в Eclipse
  • Как я могу отлаживать javascript на Android?
  • Interesting Posts

    Любые рекомендации по NAS для домашнего супер-пользователя?

    Зачем начинать с диска C в современных вычислениях?

    В чем разница между require (‘mypackage.js’) и require (‘mypackage’)?

    Запретить вкладкам Internet Explorer открывать вкладки в стеке на панели задач

    Как изменить цвет фона в меню опций Action Bar в Android 4.2?

    Зачем использовать несколько столбцов в качестве первичных ключей (составной первичный ключ)

    Переустановите структуру Ruby на OS X Yosemite

    Что касается «main (int argc, char * argv ) ‘

    Как настроить DNS-приложение heroku для домена Godaddy?

    Получить имя свойства как строку

    Можно ли использовать параллельную библиотеку задач в проекте .Net 3.5?

    Как копировать ТОЛЬКО те файлы, которые не находятся в пункте назначения?

    Process.start: как получить результат?

    Использование Cocoapods с расширением приложения

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

    Давайте будем гением компьютера.