CA2261: Do not use ConfigureAwaitOptions.SuppressThrowing
with Task<TResult>
Property | Value |
---|---|
Rule ID | CA2261 |
Title | Do not use ConfigureAwaitOptions.SuppressThrowing with Task<TResult> |
Category | Usage |
Fix is breaking or non-breaking | Non-breaking |
Enabled by default in .NET 8 | As warning |
Cause
A value of ConfigureAwaitOptions.SuppressThrowing is passed to Task<TResult>.ConfigureAwait(ConfigureAwaitOptions).
Rule description
The ConfigureAwaitOptions.SuppressThrowing option isn't supported by the generic Task<TResult>, since that might lead to returning an invalid TResult
. This rule flags the use of SuppressThrowing with Task<TResult> to surface the error at build time rather than run time.
How to fix violations
Cast the Task<TResult> to a non-generic Task before calling ConfigureAwait(ConfigureAwaitOptions).
Example
The following code snippet shows a violation of CA2261:
Task<int> t = new Task<int>(() => 1);
t.ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
The following code snippet shows the fix:
Task<int> t = new Task<int>(() => 1);
((Task)t).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
When to suppress errors
You shouldn't suppress warnings from this rule. If the task is faulted or canceled, TResult
will be invalid and cause run-time errors.