Install-Package ParallelHelper -Version 3.3.0
dotnet add package ParallelHelper --version 3.3.0
<PackageReference Include="ParallelHelper" Version="3.3.0" />
paket add ParallelHelper --version 3.3.0
#r "nuget: ParallelHelper, 3.3.0"
// Install ParallelHelper as a Cake Addin #addin nuget:?package=ParallelHelper&version=3.3.0 // Install ParallelHelper as a Cake Tool #tool nuget:?package=ParallelHelper&version=3.3.0
Parallel Helper is a static code analyzer for C# projects that supports the development of parallel and asynchronous code. The analyzer is built with the help of the .NET Compiler Platform (Roslyn) and is available as a NuGet package as well as a Visual Studio extension.
A complete rebuild of the solution should yield potential issues for all available documents.
Visual Studio Integration
For Visual Studio users, enabling the Full Solution Analysis option allows scanning of all available documents rather than only the open ones.
- Open the Visual Studio options dialog via Tools → Options.
- Navigate to the C# Advanced Settings via Text Editor → C# → Advanced → or just type Full Solution Analysis into the search field.
- Tick the option Enable full solution analysis in the Analysis property group.
Visual Studio Code Integration
VS Code requires the C# extension as well as the installation of Parallel Helper as a NuGet package into the desired projects. After the installation, it is necessary to enable the Roslyn analyzers support of the C# extension. One way to enable the analyzers is through the VS Code settings page by ticking the option Omnisharp: Enable Roslyn Analyzers.
There are currently three classes of issues:
- Best Practices (PH_P...)
- Smells (PH_S...)
- Bugs (PH_B...)
Best Practices are opinionated practices to make the code more robust.
Smells, on the other hand, denote code constellations that break commonly accepted contracts that may lead to unexpected behavior when used by 3rd parties. Moreover, missuses of specific APIs or if some APIs are more suitable for the present case are also considered a code smell.
Last but not least, the class Bugs represents the most severe of the reported issues. Parallel Helper reports this class when there is a high chance of a concurrency related problem, such as race conditions.
Most of the reported issues have a default severity of warning or suggestion. Nevertheless, some issues are silent because either they are too strict or their underlying pattern is not considered production-ready yet.
The following issues are Hidden by default:
- PH_P004 - CancellationToken not Passed Through (this analysis is covered by PH_P007)
- PH_P005 - Blocking Wait on Async Method
- PH_P010 - Async Instead of Continuation
- PH_S004 - Fire-and-forget Threads
- PH_S006 - Unnecessarily Async Methods
- PH_S008 - Timer Scheduled upon Instantiation
- PH_S033 - Fire-and-Forget Tasks
To enable reporting of one or more of the above issues, add an entry like the following one to the .editorconfig file (does not work for Visual Studio 2017).
# PH_S004: Fire-and-forget Threads dotnet_diagnostic.PH_S004.severity = suggestion
The same method allows changing the severity of any of the reported issues. The possible severities are none, silent, suggestion, warning, and error. See the Microsoft documentation about severity levels for more details. You may also take a look at the example .editorconfig that sets all analyzers to warning and makes them the least conservative.
Alternatively, an entry to the CodeAnalysis.ruleset file has the same effect.
<?xml version="1.0" encoding="utf-8"?> <RuleSet Name="My Rule Set" Description=" " ToolsVersion="15.0"> <Rules AnalyzerId="ParallelHelper" RuleNamespace="ParallelHelper"> <Rule Id="PH_S004" Action="Info" /> </Rules> </RuleSet>
See the Microsoft documentation about Rule sets for more details.
The documentation directory contains a list of all issues that Parallel Helper currently reports. Each issue has a summary of the problem that may arise — additionally, a suggestion on how to resolve said issue.
To quickly test and evaluate the functionality of Parallel Helper, get the IntegrationTests sample project available in the test directory. This project consists of various concurrency related issues.
Why do I get more issues after fixing one?
Issues are not mutually exclusive. After fixing one issue, the code may have a structure that is better recognizable by another analyzer. It is a design choice of Parallel Helper to keep the analysis implementations as simple as possible. Therefore, the analyzers are not only exceptionally fast but also less prone to false positives.
Why do I have multiple issues at the same location?
Parallel Helper consists of various analyzers, each is made to recognize a specific code constellation. Therefore, if Parallel Helper reports multiple issues at the same location, this means there is a high chance for a fundamental issue.
Because of Parallel Helper's conservative design, there is a chance of false positives, although the goal is to keep the false positive number small. Therefore, there is also a chance of false negatives. There is no guarantee that there are no concurrency problems if Parallel Helper does not report any issues.
Parallel Helper focuses on issues on a higher semantic level; thus, it generally does not report issues such as data races, although they might be part of another problem. If a thorough data race analysis is desirable, consider the use of the Visual Studio extension Parallel Checker.
There is no academic publication yet. However, Parallel Helper is based on the findings and core idea of this thesis.
- No dependencies.
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
- New Analyzer: PH_P013 - Discouraged EntityFramework Method
- New Analyzer: PH_S033 - Fire-and-Forget Tasks
- Renamed Analyzer: PH_P003 - Discouraged Thread Method (was Discouraged Method)
- Renamed Analyzer: PH_P005 - Blocking Wait on Async Method (was Missing Gate-Keeper)
- Renamed Analyzer: PH_B009 - Incomplete Monitor Synchronization on Multiple Fields (was Missing Monitor Synchronization)
- Renamed Analyzer: PH_B010 - Incomplete Monitor Synchronization on Single Field (was Missing Monitor Synchronization)
- Renamed Analyzer: PH_B004 - Single Pulse for Variable Wait Conditions (was Monitor.Wait is Enclosed By Parameter-Dependent While-Loop)
- Improved Analyzer: PH_B014 - Now reports await of as-expressions
- Improved Analyzer: PH_P005 - Now reports blocking accesses on ValueTasks
- Improved Analyzer: PH_S026 - Now reports blocking accesses on ValueTasks
- Improved Analyzer: PH_P007 - Now supports method exclusions (Task.Run by default)
- Improved Analyzer: PH_S004 - Moved Task related analysis to the new analyzer PH_S033