{"record":{"id":"0655ab9d762b7348","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-subscribescheduler","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'subscribeScheduler')","messagePattern":"Value cannot be null\\. \\(Parameter 'subscribeScheduler'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/ToAsyncObservable.cs","lineNumber":36,"sourceCode":"            return ToAsyncObservable(source, TaskPoolAsyncScheduler.Default, TaskPoolAsyncScheduler.Default);\n        }\n\n        public static IAsyncObservable<TSource> ToAsyncObservable<TSource>(this IObservable<TSource> source, 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 ToAsyncObservable(source, scheduler, scheduler);\n        }\n\n        public static IAsyncObservable<TSource> ToAsyncObservable<TSource>(this IObservable<TSource> source, IAsyncScheduler subscribeScheduler, IAsyncScheduler disposeScheduler)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (subscribeScheduler == null)\n                throw new ArgumentNullException(nameof(subscribeScheduler));\n            if (disposeScheduler == null)\n                throw new ArgumentNullException(nameof(disposeScheduler));\n\n            return Create<TSource>(async observer =>\n            {\n                var d = new CompositeAsyncDisposable();\n\n                var subscribeTask = await subscribeScheduler.ScheduleAsync(async ct =>\n                {\n                    ct.ThrowIfCancellationRequested();\n\n                    var disposable = source.Subscribe(AsyncObserver.ToObserver(observer));\n\n                    var disposeTask = AsyncDisposable.Create(() => disposeScheduler.ExecuteAsync(_ =>\n                    {\n                        disposable.Dispose();\n                        return default;\n                    }));","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/ToAsyncObservable.cs#L18-L54","documentation":"In the (source, subscribeScheduler, disposeScheduler) overload, the subscribeScheduler null check at line 36 throws ArgumentNullException. The subscribe scheduler is used to schedule the async subscription work (see subscribeScheduler.ScheduleAsync in the body), so null is invalid. Both schedulers must be provided or the shorter overloads used.","triggerScenarios":"Calling source.ToAsyncObservable(null, disposeScheduler); passing null explicitly for subscribe-only customization.","commonSituations":"Attempts to customize only disposal by passing null for subscribe; misconfigured DI binding for IAsyncScheduler.","solutions":["Pass a non-null IAsyncScheduler for subscribeScheduler (e.g. TaskPoolAsyncScheduler.Default).","If no customization is needed, use source.ToAsyncObservable() which defaults both schedulers.","Use the single-scheduler overload to share one scheduler for subscribe and dispose."],"exampleFix":"// before\nvar async = source.ToAsyncObservable(null, disposeScheduler);\n// after\nvar async = source.ToAsyncObservable(TaskPoolAsyncScheduler.Default, disposeScheduler);","handlingStrategy":"validation","validationCode":"if (subscribeScheduler is null) subscribeScheduler = TaskPoolAsyncScheduler.Default;\nvar async = source.ToAsyncObservable(subscribeScheduler, disposeScheduler);","typeGuard":"static bool HasSubscribeScheduler(IAsyncScheduler s) => s is not null;","tryCatchPattern":"try { var a = source.ToAsyncObservable(sub, disp); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"subscribeScheduler\") { /* supply scheduler */ }","preventionTips":["Never use null to signal 'default scheduler'; use the overloads","Document custom scheduler construction order","Assert schedulers non-null in composition-root tests"],"tags":["csharp","async-rx","argument-null","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"}