Как предотвратить проверку сканирования несколько раз? -- .net поле с участием system.reactive поле с участием reactive-programming пол Связанный проблема

How to prevent Scan from running multiple times?


1
vote

проблема

русский

Например

 <код> var subject = new Subject<int>(); var test = subject.Scan(0, (x, y) => {     Console.WriteLine("scan");     return x + 1; }); test.Subscribe(x => Console.WriteLine("subscribe1")); //test.Subscribe(x => Console.WriteLine("subscribe2")); Observable.Range(0, 1).Subscribe(subject); Console.WriteLine("done"); Console.Read();   

Вывод -

 <код> scan subscribe1 done   

Но если вы ращите вторую подписаться на вывод

 <код> scan subscribe1 scan subscribe2 done   

Почему сканирование работает два раза и как я могу предотвратить его? Таким образом, вывод должен быть

 <код> scan subscribe1 subscribe2 done   

Я использую тему, чтобы накапливать разные наблюдаемые. Затем я использую метод сканирования для обновления модели, а затем у меня есть разные места, где мне нужно подписаться на обновления модели. Может быть, есть лучшее решение без использования объекта?

Английский оригинал

For example

var subject = new Subject<int>(); var test = subject.Scan(0, (x, y) => {     Console.WriteLine("scan");     return x + 1; }); test.Subscribe(x => Console.WriteLine("subscribe1")); //test.Subscribe(x => Console.WriteLine("subscribe2")); Observable.Range(0, 1).Subscribe(subject); Console.WriteLine("done"); Console.Read(); 

The output is

scan subscribe1 done 

But if you uncomment second Subscribe the output is

scan subscribe1 scan subscribe2 done 

Why does the Scan run two times and how can I prevent it? So output should be

scan subscribe1 subscribe2 done 

I use Subject to accumulate different Observables. Then I use Scan method to update Model and then I have different places where I need to subscribe to Model updates. Maybe is there better solution without using Subject?

</div
        
 
 

Список ответов

3
 
vote
vote
Лучший ответ
 
<Р> Попробуйте использовать <код> Observable.Publish , чтобы получить <код> IConnectableObservable<T> .
 <код> var subject = new Subject<int>(); var test = subject     .Scan(0, (x, y) => {         Console.WriteLine("scan");         return x + 1;     })     .Publish(); test.Subscribe(x => Console.WriteLine("subscribe1")); test.Subscribe(x => Console.WriteLine("subscribe2")); test.Connect(); Observable.Range(0, 1).Subscribe(subject); Console.WriteLine("done"); Console.Read();   

Выход:

 <код> scan subscribe1 subscribe2 done   
<Р> <код> Publish поворачивает холод <код> Scan наблюдаемый в горячий наблюдаемой, которая начинает испускать значения при <код> Connect называется.
 

Try using Observable.Publish to get an IConnectableObservable<T>.

var subject = new Subject<int>(); var test = subject     .Scan(0, (x, y) => {         Console.WriteLine("scan");         return x + 1;     })     .Publish(); test.Subscribe(x => Console.WriteLine("subscribe1")); test.Subscribe(x => Console.WriteLine("subscribe2")); test.Connect(); Observable.Range(0, 1).Subscribe(subject); Console.WriteLine("done"); Console.Read(); 

Output:

scan subscribe1 subscribe2 done 

Publish turns the cold Scan observable into a hot observable that begins emitting values when Connect is called.

</div
 
 
         
         
1
 
vote
<Р> Проблемы вы видите, что <код> Subject горячей наблюдаемых в то время как <код> Scan создает новый холод наблюдаемого каждый раз, когда вы подписаться на него. <Р> Попробуйте переместить сканирование перед испытуемым вместо
 <код> var subject = new Subject<int>(); subject.Subscribe(x => Console.WriteLine("subscribe1")); subject.Subscribe(x => Console.WriteLine("subscribe2")); Observable.Range(0, 1).Scan(0, (x, y) => {     Console.WriteLine("scan");     return x + 1; }).Subscribe(subject); Console.WriteLine("done"); Console.Read();   
<Р> Вы можете также сделать это без <код> IConnectableObservable<T>0 :
 <код> IConnectableObservable<T>1  
<Р> Hot против холодной Наблюдаемые
 

The problem you are seeing is that Subject is a hot observable while Scan creates a new cold observable every time you subscribe to it.

Try moving scan before the subject instead

var subject = new Subject<int>(); subject.Subscribe(x => Console.WriteLine("subscribe1")); subject.Subscribe(x => Console.WriteLine("subscribe2")); Observable.Range(0, 1).Scan(0, (x, y) => {     Console.WriteLine("scan");     return x + 1; }).Subscribe(subject); Console.WriteLine("done"); Console.Read(); 

You can also do it without the Subject:

var test = Observable.Range(0, 1).Scan(0, (x, y) => {     Console.WriteLine("scan");     return x + 1; }).Publish();  test.Subscribe(x => Console.WriteLine("subscribe1")); test.Subscribe(x => Console.WriteLine("subscribe2")); test.Connect();  Console.WriteLine("done"); Console.Read(); 

Hot vs Cold Observables

</div
 
 
       
       

Связанный проблема

22  Как я могу настроить сортировку категории по недвижимости GRID?  ( How can i customize category sorting on a propertygrid ) 
Как я могу настроить сортировку категорий в <код> PropertyGrid ? Если я устанавливаю один из следующих ... <код> propertyGrid.PropertySort = PropertySort....

4  Как написать на пользовательский журнал событий?  ( How to write to a custom event log ) 
Я пытаюсь получить мою службу .NET Windows вправо на пользовательский журнал событий. Я использую <код> EventLogInstaller , чтобы создать журнал событий и ист...

1  Разница между несколькими наследованиями и интерфейсами в C #  ( Difference between multiple inheritance and interfaces in c sharp ) 
делает C # действительно поддерживать многократное наследование. Люди говорят, что он поддерживает многократное наследование в виде интерфейсов? Но я не думаю...

9  D8045: не может компилировать файл c 'serialCommands.c с опцией / clr / clr  ( D8045 cannot compile c file serialcommands c with the clr option ) 
Я получаю сообщение компилятора D8045. Невозможно компилировать файл C 'serialCommands.c ° С опцией / clr. Этот файл - это библиотека C, которая была написа...

4  Какую книгу на TDD для C # с лечением издевателей  ( What book on tdd for c sharp with treatment of mocks ) 
Можете ли вы помнить книгу о тестировании подразделения и TDD для C #, по крайней мере, некоторое лечение отдельных объектов? Я видел эту Вопрос Но, похож...

0  Streaminsight и долгосрочные запросы  ( Streaminsight and long running queries ) 
У меня есть приложение, построенное на вершине Streaminsight 1.2, который имеет несколько постоянных запросов, выполняющих некоторые расчеты в операторах опре...

5  Сделать структуру сущности быть нечувствительными к регистру  ( Make entity framework be case insensitive ) 
Возможно ли установить корпус строки структуры объекта нечувствителен по умолчанию? Если я использую <код> string.StartsWith("stringToCompare", StringComp...

157  Попытался прочитать или писать защищенную память. Это часто является признаком того, что другая память повреждена  ( Attempted to read or write protected memory this is often an indication that ot ) 
Я надеюсь, что кто-то может просветить меня относительно того, что может вызвать эту ошибку: попытался прочитать или писать защищенную память. Это часто яв...

1  Force ClickOnce - приложение для начала офлайн?  ( Force clickonce application to be started offline ) 
У меня есть щелчок, как только приложение здесь, что необходимо запустить в автономном режиме исключительно. Причина в том, что его необходимо начинать очен...

1  Ошибка вызова .NET класса посредством оркестрации BizTalk  ( Error of calling net class through biztalk orchestration ) 
Я пытался вызвать класс .NET через оркестровку BizTalk. Но когда я отправляю сообщение на BizTalk, он не совсем звонит в класс вместо этого получил следующую ...

0  Можно ли программно получить общую ссылку Dropbox, не отправляя пользователя на страницу входа в Dropbox?  ( Is it possible to programmatically get a shared dropbox link without sending the ) 
Я разрабатываю веб-приложение в VB.NET 4.5 и с помощью третьей стороны: <Код> Dropnet . Я задаюсь вопросом, возможно ли получить общую ссылку из Dropbox- прог...

1  MS Access + IIS + Femsonation = «Неуказанная ошибка»?  ( Ms access iis impersonation unspecified error ) 
У меня есть приложение ASP .NET (2.0), которое подключается к базе данных доступа по доли сети с использованием подражания и базовой аутентификации в IIS. Все...

6  Привязка данных и выдающееся исключение в установке  ( Data binding and throwing exception in setter ) 
Давайте скажем, у меня есть простой класс <код> public class Person { public string Name { get; set; } private int _age; public int Age { get {...

2  Высевание многих для многих кода EF первые отношения  ( Seeding many to many ef code first relationship ) 
Есть несколько других сообщений по этой теме, которую я видел, но я не смог получить правильный ответ еще (моя собственная вина, я уверен), но я хочу сеять ба...

0  NU1701, NU1202 Восстановление пакета Восстановление на свежей установке Windows / VS  ( Nu1701 nu1202 package restore errors on fresh windows vs setup ) 
Работа в команде, у нас есть решение в Git, который разрабатывается на 3 разных DEV. Я временно ушел на разное место с моим ноутбуком, где у меня свежая Win 1...

Связанный проблема

22  Как я могу настроить сортировку категории по недвижимости GRID? 
4  Как написать на пользовательский журнал событий? 
1  Разница между несколькими наследованиями и интерфейсами в C # 
9  D8045: не может компилировать файл c 'serialCommands.c с опцией / clr / clr 
4  Какую книгу на TDD для C # с лечением издевателей 
0  Streaminsight и долгосрочные запросы 
5  Сделать структуру сущности быть нечувствительными к регистру 
157  Попытался прочитать или писать защищенную память. Это часто является признаком того, что другая память повреждена 
1  Force ClickOnce - приложение для начала офлайн? 
1  Ошибка вызова .NET класса посредством оркестрации BizTalk 
0  Можно ли программно получить общую ссылку Dropbox, не отправляя пользователя на страницу входа в Dropbox? 
1  MS Access + IIS + Femsonation = «Неуказанная ошибка»? 
6  Привязка данных и выдающееся исключение в установке 
2  Высевание многих для многих кода EF первые отношения 
0  NU1701, NU1202 Восстановление пакета Восстановление на свежей установке Windows / VS