{"record":{"id":"6860abc8480e25be","repo":"dotnet/reactive","slug":"throw-new-argumentnullexception-nameof-scheduler-sample","errorCode":null,"errorMessage":"throw new ArgumentNullException(nameof(scheduler));","messagePattern":"throw new ArgumentNullException\\(nameof\\(scheduler\\)\\);","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Sample.cs","lineNumber":58,"sourceCode":"            return CreateAsyncObservable<TSource>.From(\n                source,\n                interval,\n                static async (source, interval, observer) =>\n                {\n                    var (sourceSink, sampler) = await AsyncObserver.Sample(observer, interval).ConfigureAwait(false);\n\n                    var sourceSubscription = await source.SubscribeSafeAsync(sourceSink).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(sourceSubscription, sampler);\n                });\n        }\n\n        public static IAsyncObservable<TSource> Sample<TSource>(this IAsyncObservable<TSource> source, TimeSpan interval, 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 CreateAsyncObservable<TSource>.From(\n                source,\n                (scheduler, interval),\n                static async (source, state, observer) =>\n                {\n                    var (sourceSink, sampler) = await AsyncObserver.Sample(observer, state.interval, state.scheduler).ConfigureAwait(false);\n\n                    var sourceSubscription = await source.SubscribeSafeAsync(sourceSink).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(sourceSubscription, sampler);\n                });\n        }\n    }\n\n    public partial class AsyncObserver\n    {\n        public static (IAsyncObserver<TSource>, IAsyncObserver<TSample>) Sample<TSource, TSample>(IAsyncObserver<TSource> observer)","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Sample.cs#L40-L76","documentation":"The Sample<TSource>(source, interval, scheduler) overload throws ArgumentNullException when the scheduler argument is null. The scheduler drives the periodic sampling timer, so the operator requires a concrete IAsyncScheduler; it is checked after source validation.","triggerScenarios":"Passing null as the IAsyncScheduler parameter — e.g. a scheduler resolved from configuration/DI that was never registered, a test double left unassigned, or an optional-scheduler code path passing null instead of the default.","commonSituations":"DI container missing an IAsyncScheduler registration; custom scheduler factory returning null on unsupported platform; migration from another Rx library whose overload defaulted the scheduler.","solutions":["Pass an explicit scheduler such as TaskPoolAsyncScheduler.Default or a local/new async scheduler","When the scheduler is optional, write: scheduler ?? TaskPoolAsyncScheduler.Default","Register the IAsyncScheduler in your DI container / fix the factory returning null","Use the two-argument Sample(source, interval) overload, which defaults to TaskPoolAsyncScheduler.Default"],"exampleFix":"// before\nvar sampled = src.Sample(period, scheduler); // scheduler from DI, may be null\n// after\nvar sampled = src.Sample(period, scheduler ?? TaskPoolAsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"if (scheduler is null) scheduler = TaskPoolAsyncScheduler.Default;\nvar sampled = source.Sample(interval, scheduler);","typeGuard":"static bool HasScheduler(IAsyncScheduler? s) => s is not null;","tryCatchPattern":"try\n{\n    var sampled = source.Sample(interval, scheduler);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\")\n{\n    sampled = source.Sample(interval, TaskPoolAsyncScheduler.Default);\n}","preventionTips":["Always register IAsyncScheduler in the DI container","Default optional schedulers to TaskPoolAsyncScheduler.Default at call sites","Use the two-argument overload when no custom scheduler is needed","Test scheduler resolution with a missing-registration scenario"],"tags":["csharp","null-argument","scheduler","async-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"}