{"record":{"id":"af8263a3e0932c56","repo":"dotnet/reactive","slug":"scheduler-interval","errorCode":null,"errorMessage":"scheduler","messagePattern":"scheduler","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Interval.cs","lineNumber":25,"sourceCode":"\nnamespace System.Reactive.Linq\n{\n    public partial class AsyncObservable\n    {\n        public static IAsyncObservable<long> Interval(TimeSpan period)\n        {\n            if (period < TimeSpan.Zero)\n                throw new ArgumentOutOfRangeException(nameof(period));\n\n            return Create<long>(observer => AsyncObserver.Interval(observer, period));\n        }\n\n        public static IAsyncObservable<long> Interval(TimeSpan period, IAsyncScheduler scheduler)\n        {\n            if (period < TimeSpan.Zero)\n                throw new ArgumentOutOfRangeException(nameof(period));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return Create<long>(observer => AsyncObserver.Interval(observer, period, scheduler));\n        }\n    }\n\n    public partial class AsyncObserver\n    {\n        public static ValueTask<IAsyncDisposable> Interval(IAsyncObserver<long> observer, TimeSpan period) => Timer(observer, period, period);\n\n        public static ValueTask<IAsyncDisposable> Interval(IAsyncObserver<long> observer, TimeSpan period, IAsyncScheduler scheduler) => Timer(observer, period, period, scheduler);\n    }\n}\n","sourceCodeStart":7,"sourceCodeEnd":38,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Interval.cs#L7-L38","documentation":"Interval(period, scheduler) throws ArgumentNullException with paramName \"scheduler\" when the IAsyncScheduler argument is null. A scheduler is mandatory in this overload because Interval relies on it to schedule each tick.","triggerScenarios":"Calling AsyncObservable.Interval(period, null), typically when the scheduler comes from an optional dependency, DI resolution failure, or a TestScheduler field that was never initialized.","commonSituations":"Unit tests where the TestScheduler is set up lazily and is still null, or DI containers that register the scheduler conditionally.","solutions":["Pass a valid IAsyncScheduler instance (e.g. the default scheduler exposed by the library).","Fix DI registration/initialization so the scheduler is resolved before Interval is called.","Null-check the scheduler at your composition root and fail with a clear message."],"exampleFix":"// before\nvar xs = AsyncObservable.Interval(period, _testScheduler); // still null in this test\n// after\nAssert.NotNull(_testScheduler);\nvar xs = AsyncObservable.Interval(period, _testScheduler ?? new DefaultAsyncScheduler());","handlingStrategy":"validation","validationCode":"if (scheduler is null) throw new ArgumentException(\"scheduler must be non-null\", nameof(scheduler));\n// or: scheduler ??= new DefaultAsyncScheduler();","typeGuard":"static bool HasScheduler(IAsyncScheduler s) => s is not null;","tryCatchPattern":"try { var xs = AsyncObservable.Interval(period, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { /* resolve/initialize scheduler */ }","preventionTips":["Resolve schedulers via DI before building time-based operators","Initialize TestScheduler fields in test setup, not lazily","Fail fast at composition root if scheduler resolution returns null"],"tags":["argument-null","scheduling","reactive"],"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"}