Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í
awaitoperá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
awaitv klauzulích catch (CS1985). I když můžete použítawaitv 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
awaituvnitř 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
awaitpouze ve specifických umístěních v rámci výrazů dotazu (CS1995): v kolekčním výrazu počátečnífromklauzule nebo v kolekčním výrazujoinklauzule. - Označte metody nebo výrazy lambda pomocí modifikátoru
asyncpřed použitímawait(CS1992, CS4032, CS4033). - Ujistěte se, že očekávané typy mají přístupnou
GetAwaitermetodu, která vrací typ awaiteru (CS1986). - Nepoužívejte
awaitu výrazů typuvoid(CS4008). - Změňte návratový typ na
Taskmetody, které nevrací hodnotu neboTask<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
asyncpouze u metod s tělem (CS1994).asyncOdeberte 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
asyncnaMainjako vstupní bod, nebo nepoužívejteasyncna 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).
-
asyncMísto ručního použitíMethodImplAttribute.Asyncpouž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í
awaitoperá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žijteTask<T>místo toho (CS1997). - Do asynchronních metod zahrňte alespoň jeden
awaitoperátor nebo odeberteasyncmodifikátor (CS1998). - Odeberte řádek kódu
returnpokud by metoda měla vrátitTask(CS1997, CS1998). - Změňte návratový typ metody tak, aby
Task<T>vrátil hodnotu (CS1997, CS1998). -
asyncOdeberte 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í.