{"record":{"id":"50d736974b501eed","repo":"dotnet/reactive","slug":"scheduler-fromevent","errorCode":null,"errorMessage":"scheduler","messagePattern":"scheduler","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEvent.cs","lineNumber":31,"sourceCode":"    {\n        public static IAsyncObservable<TEventArgs> FromEvent<TEventArgs>(Action<Action<TEventArgs>> addHandler, Action<Action<TEventArgs>> removeHandler)\n        {\n            if (addHandler == null)\n                throw new ArgumentNullException(nameof(addHandler));\n            if (removeHandler == null)\n                throw new ArgumentNullException(nameof(removeHandler));\n\n            return FromEventCore<Action<TEventArgs>, TEventArgs>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext());\n        }\n\n        public static IAsyncObservable<TEventArgs> FromEvent<TEventArgs>(Action<Action<TEventArgs>> addHandler, Action<Action<TEventArgs>> removeHandler, IAsyncScheduler scheduler)\n        {\n            if (addHandler == null)\n                throw new ArgumentNullException(nameof(addHandler));\n            if (removeHandler == null)\n                throw new ArgumentNullException(nameof(removeHandler));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return FromEventCore<Action<TEventArgs>, TEventArgs>(h => h, addHandler, removeHandler, scheduler);\n        }\n\n        public static IAsyncObservable<TEventArgs> FromEvent<TDelegate, TEventArgs>(Action<TDelegate> addHandler, Action<TDelegate> removeHandler)\n        {\n            if (addHandler == null)\n                throw new ArgumentNullException(nameof(addHandler));\n            if (removeHandler == null)\n                throw new ArgumentNullException(nameof(removeHandler));\n\n            return FromEventCore<TDelegate, TEventArgs>(h => ConvertDelegate<Action<TEventArgs>, TDelegate>(h), addHandler, removeHandler, GetSchedulerForCurrentContext());\n        }\n\n        public static IAsyncObservable<TEventArgs> FromEvent<TDelegate, TEventArgs>(Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IAsyncScheduler scheduler)\n        {\n            if (addHandler == null)\n                throw new ArgumentNullException(nameof(addHandler));","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEvent.cs#L13-L49","documentation":"AsyncObservable.FromEvent threw ArgumentNullException because the scheduler argument was null. This overload accepts an explicit IAsyncScheduler used to coordinate event subscription and unsubscription. The library requires a concrete scheduler; pass AsyncScheduler.Default (or a specific scheduler) when you do not need custom scheduling.","triggerScenarios":"Calling FromEvent<TEventArgs>(addHandler, removeHandler, null) with a null IAsyncScheduler while both handler delegates are non-null.","commonSituations":"Developers resolving the scheduler from DI or a config value that is null (e.g. an unbound optional service), or copying a code sample and leaving the scheduler parameter unfilled.","solutions":["Pass AsyncScheduler.Default (or the scheduler appropriate for your concurrency model) as the third argument.","Use the shorter overload FromEvent<TEventArgs>(addHandler, removeHandler), which obtains a scheduler from the current context automatically.","If the scheduler comes from DI/configuration, assert or default it before the call: scheduler ?? AsyncScheduler.Default."],"exampleFix":"// before\nvar obs = AsyncObservable.FromEvent<EventArgs>(\n    h => target.TheEvent += h,\n    h => target.TheEvent -= h,\n    null);\n// after\nvar obs = AsyncObservable.FromEvent<EventArgs>(\n    h => target.TheEvent += h,\n    h => target.TheEvent -= h,\n    AsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"if (scheduler == null) scheduler = AsyncScheduler.Default;","typeGuard":"static bool HasScheduler(IAsyncScheduler scheduler) => scheduler is not null;","tryCatchPattern":"try\n{\n    var obs = AsyncObservable.FromEvent<EventArgs>(addHandler, removeHandler, scheduler);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\")\n{\n    obs = AsyncObservable.FromEvent<EventArgs>(addHandler, removeHandler);\n}","preventionTips":["Default nullable scheduler fields to AsyncScheduler.Default at construction.","Prefer the no-scheduler overload unless you specifically need custom scheduling.","Validate DI-resolved schedulers at composition root startup."],"tags":["argument-null","scheduler","asyncrx","argument-validation"],"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"}