{"record":{"id":"a10d434d7ec0fe28","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-disposescheduler","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'disposeScheduler')","messagePattern":"Value cannot be null\\. \\(Parameter 'disposeScheduler'\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/ToAsyncObservable.cs","lineNumber":38,"sourceCode":"\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                    }));\n\n                    await d.AddAsync(disposeTask).RendezVous(subscribeScheduler);","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/ToAsyncObservable.cs#L20-L56","documentation":"In the same three-argument overload, the disposeScheduler null check at line 38 throws ArgumentNullException. Disposal of the subscription is scheduled on this scheduler; a null value would break cleanup, so the guard rejects it eagerly. This is the last of the three checks in the overload.","triggerScenarios":"Calling source.ToAsyncObservable(subscribeScheduler, null).","commonSituations":"Copy-paste of the subscribe-only overload call and leaving the second argument null; incomplete migration when the dispose scheduler concept was added.","solutions":["Provide a non-null IAsyncScheduler for disposeScheduler.","Use source.ToAsyncObservable(scheduler) to use one scheduler for both subscribe and dispose.","Use the parameterless overload to accept TaskPoolAsyncScheduler.Default for both."],"exampleFix":"// before\nvar async = source.ToAsyncObservable(subscribeScheduler, null);\n// after\nvar async = source.ToAsyncObservable(subscribeScheduler, TaskPoolAsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"if (disposeScheduler is null) disposeScheduler = TaskPoolAsyncScheduler.Default;\nvar async = source.ToAsyncObservable(subscribeScheduler, disposeScheduler);","typeGuard":"static bool HasDisposeScheduler(IAsyncScheduler d) => d is not null;","tryCatchPattern":"try { var a = source.ToAsyncObservable(sub, disp); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"disposeScheduler\") { /* supply scheduler */ }","preventionTips":["Pass the same scheduler for both subscribe and dispose unless you have a reason not to","When migrating from the single-scheduler overload, replace it rather than appending null","Review overload signatures before call-site edits"],"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"}