Megosztás a következőn keresztül:


CA2007: Ne várjon közvetlenül tevékenységre

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

Lásd még