CA2008: Do not create tasks without passing a TaskScheduler
Property | Value |
---|---|
Rule ID | CA2008 |
Title | Do not create tasks without passing a TaskScheduler |
Category | Reliability |
Fix is breaking or non-breaking | Non-breaking |
Enabled by default in .NET 8 | No |
Cause
A task creation or continuation operation uses a method overload that does not specify a TaskScheduler parameter.
Rule description
The following .NET task creation and continuation methods have overloads that allow specifying or omitting a TaskScheduler instance:
- System.Threading.Tasks.TaskFactory.StartNew methods
- System.Threading.Tasks.Task.ContinueWith methods
Always specify an explicit TaskScheduler argument to avoid the default Current value, whose behavior is defined by the caller and may vary at run time. Current returns the scheduler associated with whatever Task is currently running on that thread. If there is no such task, it returns Default, which represents the thread pool. Using Current could lead to deadlocks or UI responsiveness issues in some situations, when it was intended to create the task on the thread pool, but instead it waits to get back onto the UI thread.
For further information and detailed examples, see New TaskCreationOptions and TaskContinuationOptions in .NET Framework 4.5.
Note
VSTHRD105 - Avoid method overloads that assume TaskScheduler.Current is a similar rule implemented in Microsoft.VisualStudio.Threading.Analyzers package.
How to fix violations
To fix violations, call the method overload that takes a TaskScheduler and explicitly pass in Default or Current to make the intent clear.
When to suppress warnings
This warning is intended primarily for libraries, where the code may be executed in arbitrary environments and where code shouldn't make assumptions about the environment or how the caller of the method may be invoking or waiting on it. It may be appropriate to suppress the warning for projects that represent application code rather than library code.
Suppress a warning
If you just want to suppress a single violation, add preprocessor directives to your source file to disable and then re-enable the rule.
#pragma warning disable CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008
To disable the rule for a file, folder, or project, set its severity to none
in the configuration file.
[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none
For more information, see How to suppress code analysis warnings.