{"record":{"id":"514a89628231f57f","repo":"dotnet/reactive","slug":"scheduler-delaysubscription","errorCode":null,"errorMessage":"scheduler","messagePattern":"scheduler","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/DelaySubscription.cs","lineNumber":25,"sourceCode":"\nnamespace System.Reactive.Linq\n{\n    public partial class AsyncObservable\n    {\n        public static IAsyncObservable<TSource> DelaySubscription<TSource>(this IAsyncObservable<TSource> source, TimeSpan dueTime)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n\n            return DelaySubscription(source, dueTime, TaskPoolAsyncScheduler.Default);\n        }\n\n        public static IAsyncObservable<TSource> DelaySubscription<TSource>(this IAsyncObservable<TSource> source, TimeSpan dueTime, IAsyncScheduler scheduler)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return Create(\n                source,\n                (dueTime, scheduler),\n                static async (source, state, observer) =>\n                {\n                    var d = new CompositeAsyncDisposable();\n\n                    var task = await state.scheduler.ScheduleAsync(async ct =>\n                    {\n                        var inner = await source.SubscribeSafeAsync(observer).ConfigureAwait(false);\n                        await d.AddAsync(inner).ConfigureAwait(false);\n                    }, state.dueTime).ConfigureAwait(false);\n\n                    await d.AddAsync(task).ConfigureAwait(false);\n\n                    return d;\n                });","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/DelaySubscription.cs#L7-L43","documentation":"The scheduler-taking DelaySubscription overload throws ArgumentNullException because the scheduler argument is null. The scheduler determines when the delayed Subscribe happens; without one the operator cannot function, so the null is rejected up front rather than at subscription time.","triggerScenarios":"Calling DelaySubscription<TSource>(source, dueTime, null) — null IAsyncScheduler on the second overload.","commonSituations":"Scheduler resolved from configuration that was absent; passing a test scheduler variable that is only initialized in test mode; forgetting the default-arg overload exists.","solutions":["Pass TaskPoolAsyncScheduler.Default or another non-null IAsyncScheduler.","Use the DelaySubscription(source, dueTime) overload that defaults to TaskPoolAsyncScheduler.Default.","Ensure DI/config-provided schedulers are registered and resolved before composition."],"exampleFix":"// before\nreturn source.DelaySubscription(due, cfg.Scheduler); // cfg.Scheduler null\n// after\nreturn source.DelaySubscription(due, cfg.Scheduler ?? TaskPoolAsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"var scheduler = cfg.Scheduler ?? TaskPoolAsyncScheduler.Default;\nreturn source.DelaySubscription(due, scheduler);","typeGuard":"static IAsyncScheduler SchedulerOrDefault(IAsyncScheduler? s) => s ?? TaskPoolAsyncScheduler.Default;","tryCatchPattern":"try { return source.DelaySubscription(due, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { return source.DelaySubscription(due, TaskPoolAsyncScheduler.Default); }","preventionTips":["Coalesce configured schedulers with TaskPoolAsyncScheduler.Default.","Validate scheduler configuration at app startup.","Prefer the two-argument overload when no custom scheduler is required."],"tags":["argumentnull","scheduler","delaysubscription","asyncrx"],"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"}