Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA2007 |
Cím | Ne várjon közvetlenül tevékenységre |
Kategória | Megbízhatóság |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 9-ben | Nem |
Ok
Az aszinkron metódus közvetlenül vár.Task
Szabály leírása
Ha egy aszinkron metódus közvetlenül vár, Task a folytatás általában ugyanabban a szálban történik, amely létrehozta a feladatot, az aszinkron környezettől függően. Ez a viselkedés a teljesítmény szempontjából költséges lehet, és holtpontot eredményezhet a felhasználói felületen. Fontolja meg a meghívást Task.ConfigureAwait(Boolean) , hogy jelezhesse a folytatási szándékát.
Szabálysértések kijavítása
A szabálysértések kijavításához hívja fel ConfigureAwait a vártat Task. A paramétert vagy true
a paramétert false
is átadhatjacontinueOnCapturedContext
.
A feladat meghívása
ConfigureAwait(true)
ugyanazzal a viselkedésével rendelkezik, mint a kifejezetten nem hív.ConfigureAwait A metódus explicit meghívásával tudatja az olvasókkal, hogy szándékosan szeretné végrehajtani a folytatást az eredeti szinkronizálási környezetben.Hívja meg
ConfigureAwait(false)
a feladatot, hogy ütemezze a folytatásokat a szálkészletbe, ezáltal elkerülve a holtpontot a felhasználói felületen.false
Az átadás jó választás alkalmazásfüggetlen kódtárakhoz.
Példa
A következő kódrészlet generálja a figyelmeztetést:
public async Task Execute()
{
Task task = null;
await task;
}
A szabálysértés kijavításához hívja ConfigureAwait fel a vártat Task:
public async Task Execute()
{
Task task = null;
await task.ConfigureAwait(false);
}
Mikor kell letiltani a figyelmeztetéseket?
Ez a figyelmeztetés kódtárakra vonatkozik, ahol a kód tetszőleges környezetekben végrehajtható, és ahol a kódnak nem szabad feltételezéseket tennie a környezetről, illetve arról, hogy a metódus hívója hogyan invokált vagy várakozhat rá. Általában célszerű a figyelmeztetést teljes egészében mellőzni az olyan projektek esetében, amelyek kódtárkód helyett alkalmazáskódot jelölnek; Valójában az elemző alkalmazáskódon való futtatása (például egy WinForms- vagy WPF-projekt eseménykezelőinek gombkattintása) valószínűleg helytelen műveleteket eredményez.
Ezt a figyelmeztetést minden olyan helyzetben letilthatja, amikor a folytatást vissza kell ütemezni az eredeti környezetbe, vagy ha nincs ilyen környezet. Ha például egy gombra kattintva írja a kódot, kattintson az eseménykezelőre egy WinForms- vagy WPF-alkalmazásban, általában a várakozásból való folytatásnak a felhasználói felületen kell futnia, így a folytatás eredeti környezetbe való visszaütemezésének alapértelmezett viselkedése kívánatos. Egy másik példa, amikor kódot ír egy ASP.NET Core-alkalmazásba, alapértelmezés szerint nincs SynchronizationContext vagy TaskScheduler, ami miatt a ConfigureAwait
viselkedést valójában nem változtatná meg.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none
a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA2007.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
Kód konfigurálása elemzéshez
A következő beállítások segítségével konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezeket a beállításokat konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában szereplő összes szabályra (Megbízhatóság), amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.
Aszinkron érvénytelenítési metódusok kizárása
Beállíthatja, hogy kizárja-e az aszinkron metódusokat, amelyek nem adnak vissza értéket ebből a szabályból. Az ilyen típusú metódusok kizárásához adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
# Package version 2.9.0 and later
dotnet_code_quality.CA2007.exclude_async_void_methods = true
# Package version 2.6.3 and earlier
dotnet_code_quality.CA2007.skip_async_void_methods = true
Kimeneti típus
Azt is beállíthatja, hogy mely kimeneti szerelvénytípusokra alkalmazza ezt a szabályt. Ha például ezt a szabályt csak konzolalkalmazást vagy dinamikusan csatolt kódtárat (azaz nem felhasználói felületi alkalmazást) előállító kódra szeretné alkalmazni, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary