{"record":{"id":"12e9b23ba421e9c5","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-scheduler-take","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'scheduler')","messagePattern":"Value cannot be null\\. \\(Parameter 'scheduler'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Take.cs","lineNumber":66,"sourceCode":"                duration,\n                static async (source, duration, observer) =>\n                {\n                    var (sourceObserver, timer) = await AsyncObserver.Take(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> Take<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)  // REVIEW: scheduler not used.\n                throw new ArgumentNullException(nameof(scheduler));\n\n            if (duration == TimeSpan.Zero)\n            {\n                return Empty<TSource>();\n            }\n\n            // REVIEW: May be easier to just use TakeUntil with a Timer parameter. Do we want Take 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.Take(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/Take.cs#L48-L84","documentation":"The Take(source, duration, scheduler) overload of System.Reactive.Async requires a non-null IAsyncScheduler. The guard at Take.cs:66 throws ArgumentNullException because the scheduler parameter is null; the library refuses null dependencies up front rather than failing later during subscription.","triggerScenarios":"Calling AsyncObservable.Take(source, TimeSpan, null), or passing a scheduler field/property that was never initialized (e.g. a DI-resolved scheduler that is null).","commonSituations":"DI container not registered for IAsyncScheduler; refactoring that removed a scheduler instantiation; copying an overload call and forgetting the third argument.","solutions":["Pass a concrete scheduler such as TaskPoolAsyncScheduler.Default or NewThreadAsyncScheduler.Default.","If using DI, register IAsyncScheduler in the container and verify resolution returns non-null.","If you intended immediate/synchronous behavior, use a scheduler implementation suited to that instead of null.","If the duration is TimeSpan.Zero, use Empty<TSource>() directly so no scheduler is needed."],"exampleFix":"// before: AsyncObservable.Take(source, TimeSpan.FromSeconds(1), null)  // after: AsyncObservable.Take(source, TimeSpan.FromSeconds(1), TaskPoolAsyncScheduler.Default)","handlingStrategy":"validation","validationCode":"if (source == null) throw new ArgumentNullException(nameof(source)); if (duration < TimeSpan.Zero) throw new ArgumentOutOfRangeException(nameof(duration)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); var result = AsyncObservable.Take(source, duration, scheduler);","typeGuard":"static bool IsValidTakeWindow<TSource>(IAsyncObservable<TSource> s, TimeSpan d, IAsyncScheduler sch) => s != null && d >= TimeSpan.Zero && sch != null;","tryCatchPattern":"try { var res = AsyncObservable.Take(source, duration, scheduler); } catch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { scheduler = TaskPoolAsyncScheduler.Default; var res = AsyncObservable.Take(source, duration, scheduler); }","preventionTips":["Default scheduler fields to TaskPoolAsyncScheduler.Default at declaration.","Register IAsyncScheduler in DI and verify at startup.","Never pass null for scheduler; use the 2-arg overload when you want the default.","Use TimeSpan.Zero shortcut via Empty when no elements are needed."],"tags":["csharp","null-argument","rxjs","scheduler"],"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"}