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


Hibák és figyelmeztetések elhárítása az aszinkron metódusokban a váró operátor használatával

Ez a cikk a következő fordítóhibákat ismerteti:

  • CS1983: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek "" helyettTask<T> "T" típusúnak kell lennie.
  • CS1985: Nem lehet await kifejezést használni a fogási záradékban.
  • CS1986: A "await" megköveteli, hogy a típus megfelelő ""GetAwaiter metódussal rendelkezzen.
  • CS1989: Az aszinkron lambda kifejezések nem konvertálhatók kifejezésfákká.
  • CS1991: A "Type" nem tudja implementálni az "eseményt", mert windowsos futtatókörnyezeti esemény, az "esemény" pedig egy normál .NET-esemény.
  • CS1992: A "await" operátor csak akkor használható, ha az "async" módosítóval megjelölt metódusban vagy lambda kifejezésben található.
  • CS1994: A "async" módosító csak olyan metódusokban használható, amelyekben van törzs.
  • CS1995: A "await" operátor csak a kezdeti "from" záradék első gyűjteménykifejezésében vagy egy "join" záradék gyűjteménykifejezésében használható lekérdezési kifejezésben.
  • CS1996: Az await utasítás nem használható a lock utasítás törzsében.
  • CS1997: Mivel a függvény egy aszinkron metódus, amely egy értéket ad vissza, a visszaadott kulcsszót nem szabad objektumkifejezéssel követni.
  • CS1998: Ez az aszinkron metódus nem rendelkezik "await" operátorokkal, és szinkronban fog futni. Fontolja meg a "await" operátor használatát a nem blokkoló API-hívásokra való várakozáshoz, vagy "await Task.Run(...)" a processzorhoz kötött munka elvégzésére egy háttérszálon.
  • CS4008: Nem lehet várni a következőt: ""void.
  • CS4009: A void vagy int visszatérési típusú belépési pont nem lehet aszinkron.
  • CS4014: Mivel ez a hívás nem várható, az aktuális metódus végrehajtása a hívás befejezése előtt folytatódik. Fontolja meg az await operátor alkalmazását a hívás eredményére.
  • CS4032: A "await" operátor csak aszinkron metóduson belül használható. Fontolja meg a metódus "async" módosítóval való megjelölését, és módosítsa visszatérési típusát ""Task<T>-ra.
  • CS4033: A "await" operátor csak aszinkron metóduson belül használható. Fontolja meg a metódus megjelölését a "async" módosítóval, és módosítsa visszatérési típusát ""Task-ra.
  • CS8892: A metódus nem használható belépési pontként, mert szinkron belépési pont található.
  • CS9123: A "&" operátor nem használható paramétereken vagy helyi változókon az aszinkron metódusokban.
  • CS9330: A "MethodImplAttribute.Async" nem alkalmazható manuálisan a metódusokra. Jelölje meg az "async" metódust.

Várjon kifejezési követelményekre

  • CS1985: Az 'await' nem használható a catch záradékban.
  • CS1986: A "await" megköveteli, hogy a típus megfelelő ""GetAwaiter metódussal rendelkezzen.
  • CS1992: A "await" operátor csak akkor használható, ha a "async" módosítóval megjelölt metódusban vagy lambda kifejezésben szerepel.
  • CS1995: A "await" operátor csak a kezdeti "from" záradék első gyűjteménykifejezésében vagy egy "join" záradék gyűjteménykifejezésében használható lekérdezési kifejezésben.
  • CS1996: Nem lehet await-et használni a zárolási utasítás törzsében.
  • CS4008: Nem lehet várakozni erre: 'void'.
  • CS4032: A "await" operátor csak aszinkron metóduson belül használható. Fontolja meg a metódus megjelölését a "async" módosítóval, és módosítsa visszatérési típusát ""Task<T>-ra.
  • CS4033: A "await" operátor csak aszinkron metóduson belül használható. Fontolja meg a metódus megjelölését a "async" módosítóval, és módosítsa visszatérési típusát ""Task-ra.

Az await operátor helyes használatához kövesse az alábbi szabályokat. További információ: Aszinkron programozás aszinkronnal és várakozással.

  • Ne használja await a fogási záradékokban (CS1985). A await try blokkokat és finally blokkokat (a C# 6 és újabb verzióiban) használhatja, de a catch blokkok különleges kihívásokat jelentenek a kivételkezeléssel és a vezérlés folyamatával.
  • Ne használjon awaitlock utasításblokkokban (CS1996). A fordító ezt nem támogatja, hogy elkerülje a holtpontokra hajlamos kód kibocsátását.
  • Csak await (CS1995) adott helyeihez használható: a kezdeti from záradék első gyűjteménykifejezésén belül, vagy egy join záradék gyűjteménykifejezésén belül.
  • Metódusok vagy lambdakifejezések megjelölése a módosítóval a async használat await előtt (CS1992, CS4032, CS4033).
  • Győződjön meg arról, hogy a várakoztatott típusok olyan elérhető GetAwaiter metódussal rendelkeznek, amely egy várótípust (CS1986) ad vissza.
  • Ne alkalmazza await a típuskifejezésekre void (CS4008).
  • Módosítsa a visszatérési típust Task olyan metódusokra, amelyek nem adnak vissza értéket, vagy Task<T> olyan metódusokra, amelyek értéket adnak vissza.

Az Async metódus aláírási követelményei

  • CS1983: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek "" helyettTask<T> "T" típusúnak kell lennie.
  • CS1994: A "async" módosító csak olyan metódusokban használható, amelyekben van törzs.
  • CS4009: Void vagy int visszatérési értékkel rendelkező belépési pont nem lehet aszinkron.
  • CS8892: A metódus nem használható belépési pontként, mert szinkron belépési pont található.
  • CS9330: A "MethodImplAttribute.Async" nem alkalmazható manuálisan a metódusokra. Jelölje meg a ""async metódust.

Az aszinkron metódusok helyes deklarálásához kövesse az alábbi aláírási követelményeket. További információkért lásd az Async fő visszatérési értékeit.

  • Adja vissza az érvényes típusok egyikét: void, Task, Task<T>tevékenységhez hasonló típust IAsyncEnumerable<T>vagy IAsyncEnumerator<T> (CS1983).
  • async A módosító csak törzsű metódusokon (CS1994) használható. Távolítsa el a async módosítót az absztrakciós metódusokon a felületeken vagy osztályokban.
  • Frissítsen a C# 7.1 vagy újabb verzióra a async használatához a Main belépési pontban, vagy kerülje a async használatát belépési pontokon a korábbi verziókban (CS4009).
  • Ha szinkronizálási és aszinkron belépési pontokkal (CS8892) is rendelkezik, távolítsa el a szinkron belépési pontokat.
  • Használja a async kulcsszót a MethodImplAttribute.Async manuális alkalmazása helyett (CS9330).

Aszinkron eljárások

  • CS1989: Az aszinkron lambda kifejezések nem konvertálhatók kifejezésfákká.
  • CS1991: A "Type" nem tudja implementálni az "eseményt", mert windowsos futtatókörnyezeti esemény, az "esemény" pedig egy normál .NET-esemény.
  • CS1997: Mivel a függvény egy aszinkron metódus, amely egy értéket ad vissza, a visszaadott kulcsszót nem szabad objektumkifejezéssel követni.
  • CS1998: Ez az aszinkron metódus nem rendelkezik "await" operátorokkal, és szinkronban fog futni. Fontolja meg a "await" operátor használatát a nem blokkoló API-hívásokra való várakozáshoz, vagy "await Task.Run(...)" a processzorhoz kötött munka elvégzésére egy háttérszálon.
  • CS4014: Mivel ez a hívás nem várható, az aktuális metódus végrehajtása a hívás befejezése előtt folytatódik. Fontolja meg az await operátor alkalmazását a hívás eredményére.
  • CS9123: A "&" operátor nem használható paramétereken vagy helyi változókon az aszinkron metódusokban.

Az aszinkron kód helyes írásához és a gyakori buktatók elkerüléséhez kövesse az alábbi ajánlott eljárásokat. További információ: Aszinkron programozás aszinkronnal és várakozással.

  • Mindig használja az await szót az aszinkron metódusok hívásainál, amelyek Task vagy Task<TResult> (CS4014) értéket adnak vissza. A nem várt hívások a kivételek elvesztéséhez és váratlan viselkedéshez vezethetnek.
  • Ne adjon vissza értéket a (nem általános) aszinkron Task metódusokból, hanem használjon Task<T> (CS1997).
  • Adjon meg legalább egy await operátort az aszinkron metódusokban, vagy távolítsa el a async módosítót (CS1998).
  • Távolítsa el az utasítást return , ha a metódusnak vissza kell térnie Task (CS1997, CS1998).
  • Módosítsa a metódus visszatérési típusát érték visszaadására Task<T> (CS1997, CS1998).
  • Távolítsa el a async módosítót, és adja vissza közvetlenül a feladatot, ha nincs szüksége az aszinkron állapotú gépre (CS1997, CS1998).
  • Ne használjon aszinkron metódusokat a kifejezésfákban (CS1989). A kifejezésfák adatként jelölik a kódot, és nem támogatják az aszinkron metódusok által megkövetelt összetett állapotgép-átalakításokat.
  • Ne jelölje meg a tartozékok hozzáadását vagy eltávolítását egy interfészen vagy WinRT-eseményen aszinkronként (CS1991). Ez egy platformspecifikus korlátozás a Windows futtatókörnyezet együttműködésére vonatkozóan.
  • Kerülje az operátor (&) címének használatát az aszinkron metódusokon (CS9123) belüli kifejezéseken. A cél a felfüggesztés során áthelyezhető a memóriába, így a mutató érvénytelen.