{"record":{"id":"d90be9b45a60fa84","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-scheduler-toasyncobservable","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/ToAsyncObservable.cs","lineNumber":26,"sourceCode":"\nnamespace System.Reactive.Linq\n{\n    public partial class AsyncObservable\n    {\n        public static IAsyncObservable<TSource> ToAsyncObservable<TSource>(this IObservable<TSource> source)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n\n            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 =>","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/ToAsyncObservable.cs#L8-L44","documentation":"In ToAsyncObservable(source, scheduler), the scheduler parameter is null-checked at line 26 after the source check. The scheduler drives subscription/dispatch work, so a null would break scheduling later; the library throws immediately. Passing IAsyncScheduler.Default or TaskPoolAsyncScheduler.Default is the intended usage.","triggerScenarios":"Calling source.ToAsyncObservable(null); a scheduler field resolved from configuration/DI that is null.","commonSituations":"Custom IAsyncScheduler implementation not registered; refactoring removed the scheduler initialization; confusion between sync IScheduler and IAsyncScheduler types.","solutions":["Pass TaskPoolAsyncScheduler.Default or another valid IAsyncScheduler instance.","If using a custom scheduler, verify it is constructed before subscription.","Use the parameterless overload or the (source) overload to get default schedulers."],"exampleFix":"// before\nvar async = source.ToAsyncObservable(null);\n// after\nvar async = source.ToAsyncObservable(TaskPoolAsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"if (scheduler is null) scheduler = TaskPoolAsyncScheduler.Default;\nvar async = source.ToAsyncObservable(scheduler);","typeGuard":"static bool HasScheduler(IAsyncScheduler s) => s is not null;","tryCatchPattern":"try { var a = source.ToAsyncObservable(scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { /* default scheduler */ }","preventionTips":["Default to TaskPoolAsyncScheduler.Default when unsure","Register IAsyncScheduler bindings explicitly in DI","Do not pass null to mean 'use default'; call the shorter overload"],"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"}