{"record":{"id":"c1b84f3b113109c0","repo":"dotnet/reactive","slug":"scheduler-observable-events","errorCode":null,"errorMessage":"scheduler","messagePattern":"scheduler","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Linq/Observable.Events.cs","lineNumber":1235,"sourceCode":"        {\n            if (conversion == null)\n            {\n                throw new ArgumentNullException(nameof(conversion));\n            }\n\n            if (addHandler == null)\n            {\n                throw new ArgumentNullException(nameof(addHandler));\n            }\n\n            if (removeHandler == null)\n            {\n                throw new ArgumentNullException(nameof(removeHandler));\n            }\n\n            if (scheduler == null)\n            {\n                throw new ArgumentNullException(nameof(scheduler));\n            }\n\n            return s_impl.FromEvent(conversion, addHandler, removeHandler, scheduler);\n        }\n\n        /// <summary>\n        /// Converts a .NET event to an observable sequence, using a supplied event delegate type. Each event invocation is surfaced through an OnNext message in the resulting sequence.\n        /// For conversion of events conforming to the standard .NET event pattern, use any of the FromEventPattern overloads instead.\n        /// </summary>\n        /// <typeparam name=\"TDelegate\">The delegate type of the event to be converted.</typeparam>\n        /// <typeparam name=\"TEventArgs\">The type of the event data generated by the event.</typeparam>\n        /// <param name=\"addHandler\">Action that attaches the given event handler to the underlying .NET event.</param>\n        /// <param name=\"removeHandler\">Action that detaches the given event handler from the underlying .NET event.</param>\n        /// <returns>The observable sequence that contains the event argument objects passed to the invocations of the underlying .NET event.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"addHandler\"/> or <paramref name=\"removeHandler\"/> is null.</exception>\n        /// <remarks>\n        /// <para>\n        /// Add and remove handler invocations are made whenever the number of observers grows beyond zero.","sourceCodeStart":1217,"sourceCodeEnd":1253,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Linq/Observable.Events.cs#L1217-L1253","documentation":"The scheduled FromEvent<TDelegate,TEventArgs> overload throws ArgumentNullException when scheduler is null. The scheduler is used to marshal event notifications and is validated up-front per Rx argument contracts.","triggerScenarios":"Calling FromEvent(conversion, addHandler, removeHandler, null); a null scheduler from an unresolved dependency or default parameter left unset.","commonSituations":"Unit tests forgetting to supply a TestScheduler; DI container without IScheduler registration; scheduler field made nullable during refactoring.","solutions":["Pass Scheduler.Default or another concrete IScheduler instance.","In tests, supply a TestScheduler/ImmediateScheduler explicitly.","Fix DI registrations so IScheduler is always provided.","Drop to the non-scheduler FromEvent overload if scheduling is unnecessary."],"exampleFix":"// before\nObservable.FromEvent<EventHandler, EventArgs>(conv, add, remove, null);\n// after\nObservable.FromEvent<EventHandler, EventArgs>(conv, add, remove, Scheduler.Default);","handlingStrategy":"validation","validationCode":"if (scheduler is null) scheduler = Scheduler.Default;","typeGuard":"bool HasScheduler(IScheduler s) => s is not null;","tryCatchPattern":"try { return Observable.FromEvent(conv, add, remove, scheduler); } catch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { return Observable.FromEvent(conv, add, remove, Scheduler.Default); }","preventionTips":["Register IScheduler with your DI container","Use Scheduler.Default as a fallback default","Use TestScheduler explicitly in unit tests","Prefer non-scheduled overloads unless notifications must be marshaled"],"tags":["dotnet","reactive-extensions","null-argument","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"}