Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Property | Värde |
|---|---|
| Regel-ID | CA2012 |
| Title | Använd ValueTasks korrekt |
| Kategori | Tillförlitlighet |
| Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
| Aktiverad som standard i .NET 9 | Som förslag |
Orsak
En ValueTask instans som returneras från ett medlemsanrop används på ett sätt som kan leda till undantag, skada eller dåliga prestanda.
Regelbeskrivning
ValueTask instanser som returneras från medlemsanrop är avsedda att inväntas direkt. Försök att använda en ValueTask flera gånger eller att direkt komma åt resultatet innan det är känt att det är klart kan leda till ett undantag eller skada. Att ignorera en sådan ValueTask är sannolikt en indikation på en funktionell bugg och kan försämra prestanda.
Så här åtgärdar du överträdelser
I allmänhet bör ValueTasks vara direkt inväntat i stället för att ignoreras eller lagras på andra platser som lokala variabler eller fält.
När du ska ignorera varningar
För ValueTask objekt som returneras från godtyckliga medlemsanrop måste anroparen anta att ValueTask måste förbrukas (till exempel inväntas) en gång och bara en gång. Men om utvecklaren även styr medlemmen som anropas och har fullständig kunskap om dess implementering, kan utvecklaren veta att det är säkert att ignorera varningen, till exempel om returen ValueTask alltid omsluter ett Task objekt.
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;
// ...
}
}
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.