dotnet/reactive · error · ArgumentNullException
Value cannot be null. (Parameter 'begin')
Error message
Value cannot be null. (Parameter 'begin')
What it means
FromAsyncPattern<T1..T6> validates that the begin delegate (Func<..., AsyncCallback, object, IAsyncResult>) is non-null and throws ArgumentNullException with parameter name 'begin' otherwise. The begin delegate initiates the underlying APM operation, so a null makes the returned function unusable and is rejected at pattern-construction time. This is the six-generic-argument generated overload.
Solutions
- Pass a properly bound begin delegate, e.g. svc.BeginOp as a method group.
- Check reflection results: if methodInfo == null or the created delegate is null, fail earlier with a clear message.
- Ensure the target service/object that owns the Begin method is initialized before constructing the pattern.
Example fix
// before var begin = (Func<...>)null; var f = AsyncObservable.FromAsyncPattern<...>(begin, end); // after var f = AsyncObservable.FromAsyncPattern<...>(svc.BeginOp, svc.EndOp);
Defensive patterns
Strategy: validation
Validate before calling
if (begin is null) throw new InvalidOperationException("begin delegate missing; check reflection binding"); Type guard
bool HasBegin(Delegate begin) => begin is not null;
Try / catch
try { var f = AsyncObservable.FromAsyncPattern<T1,T2,T3,T4,T5,T6>(begin, end); }
catch (ArgumentNullException ex) when (ex.ParamName == "begin") { /* fix binding, then retry construction */ } Prevention
- Fail fast when MethodInfo-based delegate creation yields null
- Keep Begin method owner objects initialized before pattern construction
- Prefer method groups over runtime-built delegates for APM adapters
When it happens
Trigger: Calling FromAsyncPattern(begin, end) with begin == null, e.g. passing a reflected Begin method delegate that was never bound or a variable left uninitialized.
Common situations: Reflection-based binding of legacy BeginXxx methods failing silently ( MethodInfo.CreateDelegate returned null); codegen/config-driven wiring where the begin entry is missing.
Related errors
- Value cannot be null. (Parameter 'end')
- Value cannot be null. (Parameter 'begin')
- Value cannot be null. (Parameter 'subscribeAsync')
- Value cannot be null. (Parameter 'observer')
- Value cannot be null. (Parameter 'observer')
AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15).
Data as JSON: /api/errors/c0e05e9252f4c875.
Report an issue: GitHub.
Appendix: source
Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromAsyncPattern.Generated.cs:520
var subject = new SequentialAsyncAsyncSubject<Unit>();
try
{
AsyncObserver.FromAsyncPattern(subject, begin, end, arg1, arg2, arg3, arg4, arg5);
}
catch (Exception ex)
{
return Throw<Unit>(ex);
}
return subject.AsAsyncObservable();
};
}
public static Func<T1, T2, T3, T4, T5, T6, IAsyncObservable<Unit>> FromAsyncPattern<T1, T2, T3, T4, T5, T6>(Func<T1, T2, T3, T4, T5, T6, AsyncCallback, object, IAsyncResult> begin, Func<IAsyncResult, Unit> end)
{
if (begin == null)
throw new ArgumentNullException(nameof(begin));
if (end == null)
throw new ArgumentNullException(nameof(end));
return (arg1, arg2, arg3, arg4, arg5, arg6) =>
{
var subject = new SequentialAsyncAsyncSubject<Unit>();
try
{
AsyncObserver.FromAsyncPattern(subject, begin, end, arg1, arg2, arg3, arg4, arg5, arg6);
}
catch (Exception ex)
{
return Throw<Unit>(ex);
}
return subject.AsAsyncObservable();
};View on GitHub (pinned to 94b5d5ab91)