{"record":{"id":"f8ec1e967b667680","repo":"dotnet/reactive","slug":"scheduler","errorCode":null,"errorMessage":"scheduler","messagePattern":"scheduler","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Delay.cs","lineNumber":40,"sourceCode":"            return Create(\n                source,\n                dueTime,\n                static async (source, dueTime, observer) =>\n                {\n                    var (sink, drain) = await AsyncObserver.Delay(observer, dueTime).ConfigureAwait(false);\n\n                    var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(subscription, drain);\n                });\n        }\n\n        public static IAsyncObservable<TSource> Delay<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 (sink, drain) = await AsyncObserver.Delay(observer, state.dueTime, state.scheduler).ConfigureAwait(false);\n\n                    var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(subscription, drain);\n                });\n        }\n    }\n\n    public partial class AsyncObserver\n    {\n        public static Task<(IAsyncObserver<TSource>, IAsyncDisposable)> Delay<TSource>(this IAsyncObserver<TSource> observer, TimeSpan dueTime)","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Delay.cs#L22-L58","documentation":"The scheduler-taking overload of Delay throws ArgumentNullException because the scheduler argument is null. A null IAsyncScheduler cannot schedule the delay timer, so the operator rejects it up front. Callers must pass a scheduler such as TaskPoolAsyncScheduler.Default or a test scheduler.","triggerScenarios":"Calling AsyncObservable.Delay<TSource>(source, dueTime, null) — the second overload with an IAsyncScheduler parameter — passing null for 'scheduler'.","commonSituations":"A scheduler obtained from configuration/DI that was not registered; a test helper returning null; forgetting to substitute TaskPoolAsyncScheduler.Default when a custom scheduler is unavailable.","solutions":["Pass a concrete scheduler, e.g. TaskPoolAsyncScheduler.Default, NewThreadAsyncScheduler.Default, or your test scheduler.","If the scheduler comes from DI/config, verify the registration actually resolved to an instance.","Use the simpler Delay(source, dueTime) overload, which defaults to TaskPoolAsyncScheduler.Default."],"exampleFix":"// before\nvar delayed = source.Delay(TimeSpan.FromSeconds(1), maybeScheduler); // maybeScheduler is null\n// after\nvar delayed = source.Delay(TimeSpan.FromSeconds(1), maybeScheduler ?? TaskPoolAsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"var scheduler = configuredScheduler ?? TaskPoolAsyncScheduler.Default;\nvar delayed = source.Delay(TimeSpan.FromSeconds(1), scheduler);","typeGuard":"static IAsyncScheduler Resolve(IAsyncScheduler? s) => s ?? TaskPoolAsyncScheduler.Default;","tryCatchPattern":"try { var d = source.Delay(due, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { var d = source.Delay(due, TaskPoolAsyncScheduler.Default); }","preventionTips":["Always fall back to TaskPoolAsyncScheduler.Default when a configured scheduler may be absent.","Check DI registrations resolve to actual scheduler instances.","In tests, initialize scheduler fields in setup, not lazily."],"tags":["argumentnull","scheduler","delay-operator","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"}