Sdílet prostřednictvím


Řešení chyb a upozornění v asynchronních metodách pomocí operátoru await

Tento článek se zabývá následujícími chybami kompilátoru:

  • CS1983: Vzhledem k tomu, že se jedná o asynchronní metodu, musí být návratový výraz typu 'Task<T>' namísto 'T'.
  • CS1985: V klauzuli catch nelze očekávat.
  • CS1986: "await' vyžaduje, aby typ měl vhodnou metodu 'GetAwaiter'.
  • CS1989: Asynchronní výrazy lambda nelze převést na stromy výrazů.
  • CS1991: Type nemůže implementovat událost, protože se jedná o událost prostředí Windows Runtime a událost je běžnou událostí .NET.
  • CS1992: Operátor 'await' lze použít pouze v případech, kdy je obsažen v metodě nebo výrazu lambda označeném modifikátorem "async".
  • CS1994: Modifikátor 'async' lze použít pouze v metodách, které mají tělo.
  • CS1995: Operátor 'await' lze použít pouze ve výrazu dotazu v prvním výrazu kolekce počáteční klauzule 'from' nebo v rámci výrazu kolekce klauzule 'join'.
  • CS1996: V těle příkazu lock nelze použít await.
  • CS1997: Vzhledem k tomu, že funkce je asynchronní metoda, která vrací hodnotu, nesmí být za vráceným klíčovým slovem následovat výraz objektu.
  • CS1998: Tato asynchronní metoda nemá operátory 'await' a spustí se synchronně. Zvažte použití operátoru 'await' k čekání na neblokující volání rozhraní API neboawait Task.Run(...) k provedení práce vázané na procesor na vlákně na pozadí.
  • CS4008: Nelze očekávat 'void'.
  • CS4009: Vstupní bod s návratovým typem void nebo int nemůže být async.
  • CS4014: Protože toto volání není očekáváno, provádění aktuální metody pokračuje před dokončením volání. Zvažte použití await operátoru na výsledek volání.
  • CS4032: Operátor 'await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem "async" a změňte jeho návratový typ na "Task<T>".
  • CS4033: Operátor 'await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem 'async' a změnou jeho návratového typu na "Task".
  • CS8892: Metoda nebude použita jako vstupní bod, protože byl nalezen synchronní vstupní bod.
  • CS9123: Operátor '&' by neměl být použit u parametrů nebo místních proměnných v asynchronních metodách.
  • CS9330: 'MethodImplAttribute.Async' nelze ručně použít na metody. Označte metodu "async".

Požadavky výrazu Await

  • CS1985: V klauzuli catch nelze očekávat.
  • CS1986: "await' vyžaduje, aby typ měl vhodnou metodu 'GetAwaiter'.
  • CS1992: Operátor 'await' lze použít pouze v případech, kdy je obsažen v metodě nebo výraz lambda označený modifikátorem 'async'.
  • CS1995: Operátor 'await' lze použít pouze ve výrazu dotazu v prvním výrazu kolekce počáteční klauzule 'from' nebo v rámci výrazu kolekce klauzule 'join'.
  • CS1996: V textu příkazu lock nelze čekat.
  • CS4008: Nelze čekat na 'void'.
  • CS4032: Operátor 'await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem 'async' a změnou jeho návratového typu na "Task<T>".
  • CS4033: Operátor 'await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem 'async' a změnou jeho návratového typu na "Task".

Pokud chcete operátor použít await správně, postupujte podle těchto pravidel. Další informace naleznete v tématu Asynchronní programování pomocí async a await.

  • Nepoužívejte await v klauzulích catch (CS1985). I když můžete použít await v blocích try a finally (v jazyce C# 6 a novějších), bloky "catch" představují zvláštní výzvy při zpracování výjimek a toku řízení.
  • Nepoužívejte await uvnitř bloků příkazů lock (CS1996). Kompilátor to nepodporuje, aby se zabránilo generování kódu náchylného k zablokování.
  • Používejte await pouze ve specifických umístěních v rámci výrazů dotazu (CS1995): v kolekčním výrazu počáteční from klauzule nebo v kolekčním výrazu join klauzule.
  • Označte metody nebo výrazy lambda pomocí modifikátoru async před použitím await (CS1992, CS4032, CS4033).
  • Ujistěte se, že očekávané typy mají přístupnou GetAwaiter metodu, která vrací typ awaiteru (CS1986).
  • Nepoužívejte await u výrazů typu void (CS4008).
  • Změňte návratový typ na Task metody, které nevrací hodnotu nebo Task<T> metody, které vracejí hodnotu.

Požadavky na podpis asynchronní metody

  • CS1983: Vzhledem k tomu, že se jedná o asynchronní metodu, musí být návratový výraz typu 'Task<T>' namísto 'T'.
  • CS1994: Modifikátor 'async' lze použít pouze v metodách, které mají tělo.
  • CS4009: Vstupní bod vracející void nebo int nemůže být asynchronní.
  • CS8892: Metoda nebude použita jako vstupní bod, protože byl nalezen synchronní vstupní bod.
  • CS9330: 'MethodImplAttribute.Async' nelze ručně použít na metody. Označte metodu 'async'.

Pokud chcete deklarovat asynchronní metody správně, postupujte podle těchto požadavků na podpis. Další informace najdete v tématu Asynchronní hlavní návratové hodnoty.

  • Vrátí jeden z platných typů: void, Task, Task<T>, typ podobný úkolu, IAsyncEnumerable<T> nebo IAsyncEnumerator<T> (CS1983).
  • Používejte modifikátor async pouze u metod s tělem (CS1994). async Odeberte modifikátor abstraktních metod v rozhraních nebo třídách.
  • Aktualizujte na C# 7.1 nebo vyšší, aby bylo možné použít async na Main jako vstupní bod, nebo nepoužívejte async na vstupních bodech v dřívějších verzích (CS4009).
  • Odeberte synchronní vstupní body, pokud máte synchronizační i asynchronní vstupní body (CS8892).
  • async Místo ručního použití MethodImplAttribute.Async použijte klíčové slovo (CS9330).

Asynchronní postupy

  • CS1989: Asynchronní výrazy lambda nelze převést na stromy výrazů.
  • CS1991: Type nemůže implementovat událost, protože se jedná o událost prostředí Windows Runtime a událost je běžnou událostí .NET.
  • CS1997: Vzhledem k tomu, že funkce je asynchronní metoda, která vrací hodnotu, nesmí být za vráceným klíčovým slovem následovat výraz objektu.
  • CS1998: Tato asynchronní metoda nemá operátory 'await' a spustí se synchronně. Zvažte použití operátoru 'await' k čekání na neblokující volání rozhraní API neboawait Task.Run(...) k provedení práce vázané na procesor na vlákně na pozadí.
  • CS4014: Protože toto volání není očekáváno, provádění aktuální metody pokračuje před dokončením volání. Zvažte použití await operátoru na výsledek volání.
  • CS9123: Operátor '&' by neměl být použit u parametrů nebo místních proměnných v asynchronních metodách.

Pokud chcete napsat asynchronní kód správně a vyhnout se běžným nástrahám, postupujte podle těchto osvědčených postupů. Další informace naleznete v tématu Asynchronní programování pomocí async a await.

  • Vždy čeká na volání asynchronních metod, které vrací Task nebo Task<TResult> (CS4014). Nečekaná volání můžou vést ke ztrátě výjimek a neočekávanému chování.
  • Nevracejte hodnotu z asynchronních metod, které vracejí Task (ne generické), použijte Task<T> místo toho (CS1997).
  • Do asynchronních metod zahrňte alespoň jeden await operátor nebo odeberte async modifikátor (CS1998).
  • Odeberte řádek kódu return pokud by metoda měla vrátit Task (CS1997, CS1998).
  • Změňte návratový typ metody tak, aby Task<T> vrátil hodnotu (CS1997, CS1998).
  • async Odeberte modifikátor a vraťte úlohu přímo, pokud nepotřebujete asynchronní stavový počítač (CS1997, CS1998).
  • Nepoužívejte asynchronní metody ve stromech výrazů (CS1989). Stromy výrazů představují kód jako data a nepodporují transformace komplexních stavových počítačů vyžadované asynchronními metodami.
  • Nepřidávejte ani neodebívejte přístupové objekty v rozhraní ani v události WinRT jako asynchronní (CS1991). Jedná se o omezení specifické pro platformu pro interoperabilitu prostředí Windows Runtime.
  • Nepoužívejte operátor adresy (&) u výrazů uvnitř asynchronních metod (CS9123). Cíl může být během pozastavení přemísťován do paměti, což ukazatel zneplatní.