Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Property | Waarde |
|---|---|
| Regel-ID | MSTEST0076 |
| Title | Vermijd het dempen van procesbrede cultuur in een geparallelliseerde test |
| Categorie | Usage |
| Fix kan brekend of niet-brekend zijn | Non-breaking |
| standaard ingeschakeld | Yes |
| standaardniveau van ernst | Informatie |
| geïntroduceerd in versie | 4.4.0 (preview) |
| Is er een oplossing voor de code | No |
Note
Deze analyse wordt alleen geactiveerd wanneer assembly-parallellisatie syntactisch is ingeschakeld, bijvoorbeeld zonder [assembly: Parallelize] een overeenkomende [assembly: DoNotParallelize], of wanneer een .editorconfig bestand wordt ingesteld mstest_parallel_safety_mode = always. De analyse kan geen parallelle uitvoering detecteren die alleen is ingeschakeld via .runsettings of MSBuild-eigenschappen zoals MSTestParallelizeWorkers. Stel de .editorconfig optie in als u op die manier parallelle uitvoering configureert en deze analyse nog steeds wilt uitvoeren.
Oorzaak
Een test of een klasse-scoped armaturenmethode die wordt uitgevoerd onder, wijst DefaultThreadCurrentCulture of zonder een overeenkomende [ResourceLock] of DefaultThreadCurrentUICulture[DoNotParallelize].
Beschrijving van regel
CultureInfo.DefaultThreadCurrentCulture en DefaultThreadCurrentUICulture de standaardcultuur voor het hele proces instellen, zodat elke gelijktijdige uitvoeringstest de wijziging observeert en dat de opmaak of parsering kan worden beschadigd. De vormen Thread.CurrentThread.CurrentCulture/CurrentUICulture per thread en omgeving, enCurrentUICultureCultureInfo.CurrentCulture/ , worden niet gemarkeerd: op moderne .NET ze een AsyncLocalwaarde met ondersteuning toewijzen die met de uitvoeringscontext stroomt, zodat ze geen tests op hetzelfde niveau beschadigen.
[TestMethod]
public void SetsCulture()
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Violation
}
Omdat de gemarkeerde setters procesbreed zijn, helpt het herstellen van de vorige waarde in een finally blok niet: gelijktijdig uitgevoerde tests observeren nog steeds de gewijzigde cultuur voor de duur van de mutatie.
Hoe schendingen op te lossen
Voeg de test toe [DoNotParallelize] of vermijd het dempen van procesbrede cultuur en gebruik in plaats daarvan de eigenschappen per thread of omgevingscultuur.
[DoNotParallelize]
[TestMethod]
public void SetsCulture()
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
}
Er bestaat geen bekende [ResourceLock] sleutel voor cultuur, dus een aangegeven [ResourceLock] soort wordt beschouwd als een bevestiging dat u de toegang tot de cultuur hebt gecoördineerd en deze regel blijft stil.
Wanneer waarschuwingen onderdrukken
Onderdrukt geen waarschuwingen van deze regel zonder parallelle uitvoering af te sluiten of over te schakelen naar de eigenschappen van de cultuur per thread, omdat dit de mutatie op de achtergrond laat racen tegen gelijktijdig uitgevoerde tests.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable MSTEST0076
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0076
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0076.severity = none
Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.