{"record":{"id":"30d3e18b39e21fdc","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-factory","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'factory')","messagePattern":"Value cannot be null\\. \\(Parameter 'factory'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Concurrency/TaskPoolAsyncScheduler.cs","lineNumber":27,"sourceCode":"{\n    public sealed class TaskPoolAsyncScheduler : AsyncSchedulerBase\n    {\n        private readonly TaskFactory _factory;\n\n        public static TaskPoolAsyncScheduler Current { get; } = new TaskPoolAsyncScheduler(TaskScheduler.Current);\n        public static TaskPoolAsyncScheduler Default { get; } = new TaskPoolAsyncScheduler(TaskScheduler.Default);\n\n        public TaskPoolAsyncScheduler(TaskScheduler scheduler)\n        {\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            _factory = new TaskFactory(scheduler);\n        }\n\n        public TaskPoolAsyncScheduler(TaskFactory factory)\n        {\n            _factory = factory ?? throw new ArgumentNullException(nameof(factory));\n        }\n\n        protected override ValueTask Delay(TimeSpan dueTime, CancellationToken token) => new(Task.Delay(dueTime, token));\n\n        protected override ValueTask ScheduleAsyncCore(Func<CancellationToken, ValueTask> action, CancellationToken token)\n        {\n            var task = _factory.StartNew(() => action(token).AsTask(), token);\n\n            task.Unwrap().ContinueWith(t =>\n            {\n                if (!t.IsCanceled && t.Exception != null)\n                {\n                    // TODO: Call event handler.\n                }\n            });\n\n            return default;\n        }","sourceCodeStart":9,"sourceCodeEnd":45,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Concurrency/TaskPoolAsyncScheduler.cs#L9-L45","documentation":"This TaskPoolAsyncScheduler constructor overload takes an explicit TaskFactory that controls task creation options; null is rejected because scheduling depends on it. Fix: supply a real TaskFactory (e.g. new TaskFactory(scheduler)) or use the TaskScheduler-based overload.","triggerScenarios":"Thrown at AsyncRx.NET/System.Reactive.Async/Concurrency/TaskPoolAsyncScheduler.cs:27 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Supply a valid TaskFactory/TaskScheduler when constructing the scheduler.","Use TaskPoolAsyncScheduler.Default rather than constructing with null arguments."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}