dotnet/reactive · error · ArgumentNullException
scheduler
Error message
scheduler
What it means
The scheduler-taking overload of Delay throws ArgumentNullException because the scheduler argument is null. A null IAsyncScheduler cannot schedule the delay timer, so the operator rejects it up front. Callers must pass a scheduler such as TaskPoolAsyncScheduler.Default or a test scheduler.
Solutions
- Pass a concrete scheduler, e.g. TaskPoolAsyncScheduler.Default, NewThreadAsyncScheduler.Default, or your test scheduler.
- If the scheduler comes from DI/config, verify the registration actually resolved to an instance.
- Use the simpler Delay(source, dueTime) overload, which defaults to TaskPoolAsyncScheduler.Default.
Example fix
// before var delayed = source.Delay(TimeSpan.FromSeconds(1), maybeScheduler); // maybeScheduler is null // after var delayed = source.Delay(TimeSpan.FromSeconds(1), maybeScheduler ?? TaskPoolAsyncScheduler.Default);
Defensive patterns
Strategy: validation
Validate before calling
var scheduler = configuredScheduler ?? TaskPoolAsyncScheduler.Default; var delayed = source.Delay(TimeSpan.FromSeconds(1), scheduler);
Type guard
static IAsyncScheduler Resolve(IAsyncScheduler? s) => s ?? TaskPoolAsyncScheduler.Default;
Try / catch
try { var d = source.Delay(due, scheduler); }
catch (ArgumentNullException ex) when (ex.ParamName == "scheduler") { var d = source.Delay(due, TaskPoolAsyncScheduler.Default); } Prevention
- Always fall back to TaskPoolAsyncScheduler.Default when a configured scheduler may be absent.
- Check DI registrations resolve to actual scheduler instances.
- In tests, initialize scheduler fields in setup, not lazily.
When it happens
Trigger: Calling AsyncObservable.Delay<TSource>(source, dueTime, null) — the second overload with an IAsyncScheduler parameter — passing null for 'scheduler'.
Common situations: A scheduler obtained from configuration/DI that was not registered; a test helper returning null; forgetting to substitute TaskPoolAsyncScheduler.Default when a custom scheduler is unavailable.
Related errors
- source
- observer
- scheduler
- Value cannot be null. (Parameter 'onErrorAsync')
- Value cannot be null. (Parameter 'onCompletedAsync')
AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15).
Data as JSON: /api/errors/f8ec1e967b667680.
Report an issue: GitHub.
Appendix: source
Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Delay.cs:40
return Create(
source,
dueTime,
static async (source, dueTime, observer) =>
{
var (sink, drain) = await AsyncObserver.Delay(observer, dueTime).ConfigureAwait(false);
var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);
return StableCompositeAsyncDisposable.Create(subscription, drain);
});
}
public static IAsyncObservable<TSource> Delay<TSource>(this IAsyncObservable<TSource> source, TimeSpan dueTime, IAsyncScheduler scheduler)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
if (scheduler == null)
throw new ArgumentNullException(nameof(scheduler));
return Create(
source,
(dueTime, scheduler),
static async (source, state, observer) =>
{
var (sink, drain) = await AsyncObserver.Delay(observer, state.dueTime, state.scheduler).ConfigureAwait(false);
var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);
return StableCompositeAsyncDisposable.Create(subscription, drain);
});
}
}
public partial class AsyncObserver
{
public static Task<(IAsyncObserver<TSource>, IAsyncDisposable)> Delay<TSource>(this IAsyncObserver<TSource> observer, TimeSpan dueTime)View on GitHub (pinned to 94b5d5ab91)