diff --git a/Rx.NET/Source/src/System.Reactive/Linq/Observable/FirstAsync.cs b/Rx.NET/Source/src/System.Reactive/Linq/Observable/FirstAsync.cs index 2d2e6527c4..14a1b6fa96 100644 --- a/Rx.NET/Source/src/System.Reactive/Linq/Observable/FirstAsync.cs +++ b/Rx.NET/Source/src/System.Reactive/Linq/Observable/FirstAsync.cs @@ -21,6 +21,8 @@ public Sequence(IObservable source) internal sealed class _ : IdentitySink { + bool _found; + public _(IObserver observer) : base(observer) { @@ -28,13 +30,15 @@ public _(IObserver observer) public override void OnNext(TSource value) { + _found = true; ForwardOnNext(value); ForwardOnCompleted(); } public override void OnCompleted() { - ForwardOnError(new InvalidOperationException(Strings_Linq.NO_ELEMENTS)); + if (!_found) + ForwardOnError(new InvalidOperationException(Strings_Linq.NO_ELEMENTS)); } } } @@ -58,6 +62,8 @@ internal sealed class _ : IdentitySink { private readonly Func _predicate; + bool _found; + public _(Func predicate, IObserver observer) : base(observer) { @@ -80,6 +86,7 @@ public override void OnNext(TSource value) if (b) { + _found = true; ForwardOnNext(value); ForwardOnCompleted(); } @@ -87,7 +94,8 @@ public override void OnNext(TSource value) public override void OnCompleted() { - ForwardOnError(new InvalidOperationException(Strings_Linq.NO_MATCHING_ELEMENTS)); + if (!_found) + ForwardOnError(new InvalidOperationException(Strings_Linq.NO_MATCHING_ELEMENTS)); } } }