diff --git a/src/CenterEdge.Async/AsyncHelper.cs b/src/CenterEdge.Async/AsyncHelper.cs index cf22c40..8b1e3dc 100644 --- a/src/CenterEdge.Async/AsyncHelper.cs +++ b/src/CenterEdge.Async/AsyncHelper.cs @@ -58,6 +58,16 @@ public static void RunSync(Func task) /// public static void RunSync(Func task, TState state) { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(task); +#else + if (task is null) + { + ThrowHelper.ThrowArgumentNullException(nameof(task)); + return; // unreachable, but helps static analysis + } +#endif + var oldContext = SynchronizationContext.Current; if (IsDeadlockSafe(oldContext)) @@ -101,6 +111,16 @@ public static void RunSync(Func task, TState state) [OverloadResolutionPriority(-1)] public static void RunSync(Func task) { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(task); +#else + if (task is null) + { + ThrowHelper.ThrowArgumentNullException(nameof(task)); + return; // unreachable, but helps static analysis + } +#endif + RunSync(static state => state.Invoke(), task); } @@ -116,6 +136,16 @@ public static void RunSync(Func task) [OverloadResolutionPriority(-1)] public static void RunSync(Func task, TState state) { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(task); +#else + if (task is null) + { + ThrowHelper.ThrowArgumentNullException(nameof(task)); + return; // unreachable, but helps static analysis + } +#endif + var oldContext = SynchronizationContext.Current; if (IsDeadlockSafe(oldContext)) @@ -161,6 +191,16 @@ public static void RunSync(Func task, TState state) /// public static T RunSync(Func> task) { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(task); +#else + if (task is null) + { + ThrowHelper.ThrowArgumentNullException(nameof(task)); + return default!; // unreachable, but helps static analysis + } +#endif + return RunSync(static state => state.Invoke(), task); } @@ -176,6 +216,16 @@ public static T RunSync(Func> task) /// public static T RunSync(Func> task, TState state) { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(task); +#else + if (task is null) + { + ThrowHelper.ThrowArgumentNullException(nameof(task)); + return default!; // unreachable, but helps static analysis + } +#endif + var oldContext = SynchronizationContext.Current; if (IsDeadlockSafe(oldContext)) @@ -219,6 +269,16 @@ public static T RunSync(Func> task, TState state) [OverloadResolutionPriority(-1)] public static T RunSync(Func> task) { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(task); +#else + if (task is null) + { + ThrowHelper.ThrowArgumentNullException(nameof(task)); + return default!; // unreachable, but helps static analysis + } +#endif + return RunSync(static state => state.Invoke(), task); } @@ -235,6 +295,16 @@ public static T RunSync(Func> task) [OverloadResolutionPriority(-1)] public static T RunSync(Func> task, TState state) { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(task); +#else + if (task is null) + { + ThrowHelper.ThrowArgumentNullException(nameof(task)); + return default!; // unreachable, but helps static analysis + } +#endif + var oldContext = SynchronizationContext.Current; if (IsDeadlockSafe(oldContext)) diff --git a/src/CenterEdge.Async/CenterEdge.Async.csproj b/src/CenterEdge.Async/CenterEdge.Async.csproj index e3a91e3..f6b5849 100644 --- a/src/CenterEdge.Async/CenterEdge.Async.csproj +++ b/src/CenterEdge.Async/CenterEdge.Async.csproj @@ -29,6 +29,10 @@ + + + + diff --git a/src/CenterEdge.Async/ExclusiveSynchronizationContext.cs b/src/CenterEdge.Async/ExclusiveSynchronizationContext.cs index e362d03..3497cc9 100644 --- a/src/CenterEdge.Async/ExclusiveSynchronizationContext.cs +++ b/src/CenterEdge.Async/ExclusiveSynchronizationContext.cs @@ -20,6 +20,16 @@ public override void Send(SendOrPostCallback d, object? state) public override void Post(SendOrPostCallback d, object? state) { +#if NET6_0_OR_GREATER + ArgumentNullException.ThrowIfNull(d); +#else + if (d is null) + { + ThrowHelper.ThrowArgumentNullException(nameof(d)); + return; // unreachable, but helps static analysis + } +#endif + try { _items.Add(new WorkItem(d, state)); diff --git a/src/CenterEdge.Async/ThrowHelper.cs b/src/CenterEdge.Async/ThrowHelper.cs new file mode 100644 index 0000000..b794b17 --- /dev/null +++ b/src/CenterEdge.Async/ThrowHelper.cs @@ -0,0 +1,9 @@ +using System; + +namespace CenterEdge.Async; + +internal class ThrowHelper +{ + public static void ThrowArgumentNullException(string paramName) => + throw new ArgumentNullException(paramName); +}