CA2007: Ne várjon közvetlenül feladatra

Tulajdonság Érték
Szabályazonosító CA2007
Cím Ne várj közvetlenül feladatra
Kategória Megbízhatóság
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Nem
Alkalmazandó nyelvek C# és Visual Basic

Ok

Az aszinkron metódus közvetlenül vár.Task

Szabály leírása

Amikor egy aszinkron metódus közvetlenül vár egy Task-re, a folytatás általában ugyanazon a szálon 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 az Task.ConfigureAwait(Boolean) hívását, hogy jelezze 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 meg ConfigureAwait a várt Task-et. A continueOnCapturedContext paraméterhez átadhatja a true vagy a false értékeket.

  • A ConfigureAwait(true) hívása a feladaton ugyanazt az eredményt adja, mint ha nem hívnánk meg kifejezetten 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 a ConfigureAwait(false)-t a feladatra, hogy ütemezze a folytatásokat a szálkészletben, ezzel elkerülve a holtpontot a felhasználói felület szálán. Az false átadása jó megoldá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. Például, amikor egy gombkattintási eseménykezelőben ír kódot egy WinForms- vagy WPF-alkalmazásban, általában az 'await' utáni folytatásnak a felhasználói felületen kell futnia, ezért kívánatos a folytatás visszaütemezése az eredeti környezetbe. 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 void 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