Rx ForkJoin не работает с пользовательским событием - PullRequest
1 голос
/ 27 июня 2011

У меня есть несколько пользовательских аргументов:

AutoOccurPerformedEventArgs : EventArgs

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

var events = new[]
                        {
                            Observable.FromEvent<AutoOccurPerformedEventArgs>(viewModel1, "AutoOccurActionPerformed"),
                            Observable.FromEvent<AutoOccurPerformedEventArgs>(viewModel2, "AutoOccurActionPerformed"),
                        };
events.ForkJoin().Subscribe(op => IsUpdatedByAutoOccur = op.Any(observedItem => observedItem.EventArgs.IsUpdatedByAutoOccur));

Мой анонимный делегат в подписке никогда не вызывается. Никаких исключений не возникает, делегат просто никогда не вызывается.

Однако, если я подписываюсь на каждое событие индивидуально, без ForkJoin, события обрабатываются корректно (хотя и отдельно)

Observable.FromEvent<AutoOccurPerformedEventArgs>(viewModel1, "AutoOccurActionPerformed")
                .Subscribe(o => IsUpdatedByAutoOccur = o.EventArgs.IsUpdatedByAutoOccur ? true : IsUpdatedByAutoOccur);

Observable.FromEvent<AutoOccurPerformedEventArgs>(viewModel2, "AutoOccurActionPerformed")
                .Subscribe(o => IsUpdatedByAutoOccur = o.EventArgs.IsUpdatedByAutoOccur ? true : IsUpdatedByAutoOccur);

Есть идеи, почему ForkJoin не работает?

1 Ответ

2 голосов
/ 27 июня 2011

Ознакомьтесь с справкой по intellisense по методу ForkJoin.Несмотря на орфографическую ошибку, он говорит:

Запускает две наблюдаемые последовательности параллельно и объединяет их последние элементы.

Поскольку вы делаете ForkJoin над событиями, вы будетеникогда не получите результат, потому что этот тип наблюдаемых никогда не завершится.

Возможно, вы захотите использовать Merge или CombineLatest для достижения того, что вы хотите, но так как вы не описали свое намерение, я не могу датьлучшее предложение.

...