{"record":{"id":"96fe4f2f32d43a0e","repo":"dotnet/reactive","slug":"scheduler-skip","errorCode":null,"errorMessage":"scheduler","messagePattern":"scheduler","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Skip.cs","lineNumber":66,"sourceCode":"                duration,\n                static async (source, duration, observer) =>\n                {\n                    var (sourceObserver, timer) = await AsyncObserver.Skip(observer, duration).ConfigureAwait(false);\n\n                    var subscription = await source.SubscribeSafeAsync(sourceObserver).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(subscription, timer);\n                });\n        }\n\n        public static IAsyncObservable<TSource> Skip<TSource>(this IAsyncObservable<TSource> source, TimeSpan duration, IAsyncScheduler scheduler)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (duration < TimeSpan.Zero)\n                throw new ArgumentOutOfRangeException(nameof(duration));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            if (duration == TimeSpan.Zero)\n            {\n                return source;\n            }\n\n            // REVIEW: May be easier to just use SkipUntil with a Timer parameter. Do we want Skip on the observer?\n\n            return CreateAsyncObservable<TSource>.From(\n                source,\n                (duration, scheduler),\n                static async (source, state, observer) =>\n                {\n                    var (sourceObserver, timer) = await AsyncObserver.Skip(observer, state.duration).ConfigureAwait(false);\n\n                    var subscription = await source.SubscribeSafeAsync(sourceObserver).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(subscription, timer);","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Skip.cs#L48-L84","documentation":"This time-based Skip overload requires an IAsyncScheduler to run the per-element duration timers; null is rejected at operator creation. Fix: pass a scheduler (e.g. TaskPoolAsyncScheduler.Default) or use the overload without an explicit scheduler.","triggerScenarios":"Calling Skip(source, duration, null), e.g. a scheduler field/property not yet initialized or a DI-resolved scheduler that failed to register.","commonSituations":"Missing DI registration for IAsyncScheduler; using a scheduler obtained from a service that returned null; forgetting to pass TaskPoolAsyncScheduler.Default explicitly.","solutions":["Pass a valid scheduler such as TaskPoolAsyncScheduler.Default or the NewDefaultAsyncScheduler","Fix DI registration so IAsyncScheduler is provided","Use the two-argument Skip(source, duration) overload, which defaults to TaskPoolAsyncScheduler.Default"],"exampleFix":"// before\nsource.Skip(TimeSpan.FromSeconds(1), null);\n// after\nsource.Skip(TimeSpan.FromSeconds(1), TaskPoolAsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"if (scheduler == null) scheduler = TaskPoolAsyncScheduler.Default;\nvar res = source.Skip(TimeSpan.FromSeconds(1), scheduler);","typeGuard":"bool IsValidScheduler(IAsyncScheduler s) => s != null;","tryCatchPattern":"try { var res = source.Skip(dur, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { res = source.Skip(dur); } // default scheduler overload","preventionTips":["Default to TaskPoolAsyncScheduler.Default when no scheduler is configured","Verify DI registration for IAsyncScheduler at startup","Prefer the two-argument overload when a custom scheduler is not needed"],"tags":["null-argument","scheduler","rx"],"backgroundTag":"null-argument","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}