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.
| Eigenschappen | Weergegeven als |
|---|---|
| Regel-id | CA2012 |
| Titel | ValueTasks correct gebruiken |
| Categorie | Betrouwbaarheid |
| Oplossing is brekend of niet-brekend | Niet-brekend |
| Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Een ValueTask exemplaar dat wordt geretourneerd door een aanroep van een lid, wordt gebruikt op een manier die kan leiden tot uitzonderingen, beschadiging of slechte prestaties.
Beschrijving van regel
ValueTask instanties die worden geretourneerd door lid-aanroepen, zijn bedoeld om direct te worden gewacht. Pogingen om een ValueTask meerdere keren te gebruiken of om rechtstreeks toegang te krijgen tot het resultaat van een waarde voordat bekend is dat het is voltooid, kan leiden tot een uitzondering of beschadiging. Het negeren van een dergelijke ValueTask is waarschijnlijk een indicatie van een functionele bug en kan de prestaties verminderen.
Schendingen oplossen
Over het algemeen moet ValueTasks rechtstreeks worden gewacht in plaats van deze te verwijderen of op te slaan in andere locaties, zoals lokale variabelen of velden.
Wanneer waarschuwingen onderdrukken
Voor ValueTask objecten die worden geretourneerd door willekeurige lid-aanroepen, moet de beller ervan uitgaan dat de ValueTask aanroeper één keer en slechts één keer moet worden verbruikt (bijvoorbeeld in afwachting). Als de ontwikkelaar echter ook het lid beheert dat wordt aangeroepen en volledige kennis van de implementatie heeft, weet de ontwikkelaar mogelijk dat het veilig is om de waarschuwing te onderdrukken, bijvoorbeeld als de retour ValueTask altijd een Task object verpakt.
Example
public class NumberValueTask
{
public async ValueTask<int> GetNumberAsync()
{
await Task.Delay(100);
return 123;
}
public async Task UseValueTaskIncorrectlyAsync()
{
// This code violates the rule,
// because ValueTask is awaited multiple times
ValueTask<int> numberValueTask = GetNumberAsync();
int first = await numberValueTask;
int second = await numberValueTask; // <- illegal reuse
// ...
}
// This code satisfies the rule.
public async Task UseValueTaskCorrectlyAsync()
{
int first = await GetNumberAsync();
int second = await GetNumberAsync();
// ..
}
public async Task UseValueTaskAsTaskAsync()
{
ValueTask<int> numberValueTask = GetNumberAsync();
Task<int> numberTask = numberValueTask.AsTask();
int first = await numberTask;
int second = await numberTask;
// ...
}
}
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 CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.