dotnet/reactive · error · ArgumentNullException

Value cannot be null. (Parameter 'scheduler')

Error message

Value cannot be null. (Parameter 'scheduler')

What it means

This Repeat(value, scheduler) overload endlessly repeats a value on the given IAsyncScheduler. The library throws ArgumentNullException because the scheduler is required to schedule each emission; a null scheduler has no valid default substitution in this overload.

Solutions

  1. Pass a valid scheduler instance, e.g. AsyncScheduler.Default (or the library's default/immediate scheduler)
  2. Fix the DI/registration so the IAsyncScheduler resolves non-null
  3. Null-check the scheduler at the call site and substitute a default before calling Repeat

Example fix

// before
var obs = AsyncObservable.Repeat(42, GetConfiguredScheduler()); // GetConfiguredScheduler() may return null
// after
var sched = GetConfiguredScheduler() ?? AsyncScheduler.Default;
var obs = AsyncObservable.Repeat(42, sched);
Defensive patterns

Strategy: validation

Validate before calling

if (scheduler == null) scheduler = AsyncScheduler.Default;
var obs = AsyncObservable.Repeat(value, scheduler);

Type guard

static bool HasScheduler(IAsyncScheduler s) => s != null;

Try / catch

try
{
    var obs = AsyncObservable.Repeat(value, scheduler);
}
catch (ArgumentNullException ex) when (ex.ParamName == "scheduler")
{
    var obs = AsyncObservable.Repeat(value, AsyncScheduler.Default);
}

Prevention

When it happens

Trigger: Calling AsyncObservable.Repeat(value, scheduler) with a null scheduler, e.g. a scheduler resolved from configuration/DI that was not registered or a field never initialized.

Common situations: Scheduler resolved from a DI container that lacks a registration; passing the result of a lookup helper that returns null on failure; test code constructing schedulers conditionally.

Related errors


AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15). Data as JSON: /api/errors/ad5725088806c142. Report an issue: GitHub.

Appendix: source

Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Repeat.cs:23

using System.Collections.Generic;
using System.Linq;
using System.Reactive.Concurrency;
using System.Reactive.Disposables;
using System.Threading.Tasks;

namespace System.Reactive.Linq
{
    public partial class AsyncObservable
    {
        public static IAsyncObservable<TSource> Repeat<TSource>(TSource value)
        {
            return Create<TSource>(observer => AsyncObserver.Repeat(observer, value));
        }

        public static IAsyncObservable<TSource> Repeat<TSource>(TSource value, IAsyncScheduler scheduler)
        {
            if (scheduler == null)
                throw new ArgumentNullException(nameof(scheduler));

            return Create<TSource>(observer => AsyncObserver.Repeat(observer, value, scheduler));
        }

        public static IAsyncObservable<TSource> Repeat<TSource>(TSource value, int repeatCount)
        {
            if (repeatCount < 0)
                throw new ArgumentNullException(nameof(repeatCount));

            return Create<TSource>(observer => AsyncObserver.Repeat(observer, value, repeatCount));
        }

        public static IAsyncObservable<TSource> Repeat<TSource>(TSource value, int repeatCount, IAsyncScheduler scheduler)
        {
            if (repeatCount < 0)
                throw new ArgumentNullException(nameof(repeatCount));
            if (scheduler == null)
                throw new ArgumentNullException(nameof(scheduler));

View on GitHub (pinned to 94b5d5ab91)