diff --git a/Rx.NET/Source/src/System.Reactive/Joins/ActivePlan.cs b/Rx.NET/Source/src/System.Reactive/Joins/ActivePlan.cs index 0fc5de2700..4327e47434 100644 --- a/Rx.NET/Source/src/System.Reactive/Joins/ActivePlan.cs +++ b/Rx.NET/Source/src/System.Reactive/Joins/ActivePlan.cs @@ -14,7 +14,10 @@ internal abstract class ActivePlan protected void AddJoinObserver(IJoinObserver joinObserver) { - joinObservers.Add(joinObserver, joinObserver); + if (!joinObservers.ContainsKey(joinObserver)) + { + joinObservers.Add(joinObserver, joinObserver); + } } protected void Dequeue() @@ -1432,4 +1435,4 @@ internal override void Match() } } } -} \ No newline at end of file +} diff --git a/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/WhenTest.cs b/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/WhenTest.cs index 044f1e37ba..b3108e9247 100644 --- a/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/WhenTest.cs +++ b/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/WhenTest.cs @@ -223,5 +223,15 @@ private IEnumerable> GetPlans(Exception ex) yield break; } + [Fact] + public void SameSource() + { + var source = Observable.Range(1, 5); + + var list = Observable.When(source.And(source).Then((a, b) => a + b)) + .ToList().First(); + + Assert.Equal(new List() { 2, 4, 6, 8, 10 }, list); + } } }