A várakozási operátort használó aszinkron metódusok hibáinak és figyelmeztetéseinek megoldása

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

  • CS1983: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek "" helyettT "Task<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.
  • CS4001: Nem várható meg a kifejezés.
  • CS4003: A "await" nem használható azonosítóként aszinkron metóduson vagy lambdakifejezésen belül.
  • CS4005: Az aszinkron metódusok nem rendelkeznek mutatótípus-paraméterekkel.
  • CS4006: __arglist nem engedélyezett az aszinkron metódusok paraméterlistájában.
  • CS4007: A típuspéldányok nem őrizhetők meg a "await" vagy a "yield" határvonalon.
  • 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.
  • CS4010: Az aszinkron kifejezés nem konvertálható delegált típussá. Az aszinkron kifejezés void, Task vagy Task<T> típusú lehet, amelyek közül egyik sem konvertálható a delegált típusba.
  • CS4011: A 'await' megköveteli, hogy a "{1}.GetAwaiter()" visszatérési típusa rendelkezzen megfelelő 'IsCompleted', 'OnCompleted' és 'GetResult' tagokkal, és valósítsa meg az 'INotifyCompletion' vagy 'ICriticalNotifyCompletion' interfészeket.
  • CS4012: A típusparaméterek nem deklarálhatók aszinkron metódusokban vagy aszinkron lambdakifejezésekben.
  • 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.
  • CS4015: A "MethodImplOptions.Syncd" nem alkalmazható aszinkron metódusra.
  • CS4016: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek feladat típusúnak kell lennie a deklarált típus helyett.
  • CS4027: A kifejezés típusa nem implementálja a szükséges tagot.
  • CS4028: A ""await megköveteli, hogy a típus megfelelő GetAwaiter metódussal rendelkezzen. Hiányzik a "System" használatára vonatkozó irányelv?
  • CS4029: Nem adható vissza "void" típusú kifejezés.
  • CS4030: A biztonsági attribútum nem alkalmazható aszinkron metódusra.
  • CS4031: Az aszinkron metódusok nem engedélyezettek a SecurityCritical vagy SecuritySafeCritical attribútummal rendelkező interfészben, osztályban vagy struktúrában.
  • 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.
  • CS4034: A "await" operátor csak aszinkron metóduson belül használható. Érdemes lehet megjelölni ezt a metódust az "async" módosítóval.
  • CS8031: Egy feladattal értéket visszaadó delegálttá konvertált aszinkron lambda kifejezés nem tud értéket visszaadni.
  • CS8100: A "await" operátor nem használható statikus szkriptváltozó inicializálójában.
  • CS8177: Az aszinkron metódusok nem rendelkeznek hivatkozási helyi adatokkal.
  • CS8178: A metódushívás által visszaadott hivatkozás nem őrizhető meg a "" vagy aawait "yield" határvonalon.
  • CS8204: A típuscél AsyncMethodBuilderként való használatához a Tevékenység tulajdonságnak céltípust kell visszaadnia a deklarált típus helyett.
  • CS8403: Az iterátorblokkot tartalmazó metódusnak ""async kell lennie az IAsyncEnumerable<T> visszaadásához.
  • CS8411: Az aszinkron foreach utasítás nem működik típusváltozókon, mert a típus nem tartalmaz megfelelő nyilvános példány- vagy bővítménydefiníciót a szükséges taghoz.
  • CS8892: A metódus nem használható belépési pontként, mert szinkron belépési pont található.
  • CS8935: Az AsyncMethodBuilder attribútum explicit visszatérési típus nélkül nem engedélyezett a névtelen metódusokon.
  • CS8940: Általános feladathoz hasonló visszatérési típus várt, de az AsyncMethodBuilder attribútumban talált típus nem volt megfelelő. Kötetlen általános aritástípusnak kell lennie, és a benne található típusnak (ha van ilyen) nem általánosnak kell lennie.
  • 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.
  • CS4034: A "await" operátor csak aszinkron metóduson belül használható. Érdemes lehet megjelölni ezt a metódust az "async" módosítóval.
  • CS8178: A hívás által visszaadott hivatkozás nem őrizhető meg a "await" vagy a "yield" határon.
  • CS8411: Az aszinkron foreach utasítás nem működik típusváltozókon, mert a típus nem tartalmaz megfelelő nyilvános példány- vagy bővítménydefiníciót a szükséges taghoz.
  • CS4001: Nem várható meg a kifejezés.
  • CS4003: A "await" nem használható azonosítóként aszinkron metóduson vagy lambdakifejezésen belül.
  • CS4007: A típuspéldányok nem őrizhetők meg a "await" vagy a "yield" határvonalon.
  • CS4011: A ""await megköveteli, hogy a "GetAwaiter()" visszatérési típusa megfelelő "IsCompleted", "OnCompleted" és "GetResult" tagokkal rendelkezzen, és implementálja az "INotifyCompletion" vagy az "ICriticalNotifyCompletion" kifejezést.
  • CS4027: A típus nem implementálja a szükséges tagot.
  • CS4028: A ""await megköveteli, hogy a típus megfelelő GetAwaiter metódussal rendelkezzen. Hiányzik a "System" használatára vonatkozó irányelv?
  • CS8100: A "await" operátor nem használható statikus szkriptváltozó inicializálójában.

Az alábbi elemek bemutatják, hogyan lehet kijavítani az egyes hibákat. Az await operátorról és a várakoztató mintáról további információt az Aszinkron programozás async és await használatával című témakörben talál.

  • Adja hozzá a async módosítót a kifejezést tartalmazó await metódushoz vagy lambda kifejezéshez (CS1992, CS4032, CS4033, CS4034). A fordítónak szüksége van a async módosítóra, hogy létrehozhassa az aszinkron felfüggesztést és újrakezdést kezelő állapotgépet. A hiba három változata környezetspecifikus javaslatokat ad a helyes visszatérési típusra.
  • Amikor a C# 5 vagy korábbi verziót célozza meg (await), helyezze át a catch kifejezéseket a blokkokból. A C# 6-tól kezdve a fordító mindkét await esetben és catch blokkokban is támogatjafinally. Ez a hiba már nem a C# 6-os és újabb verzióiban jön létre.
  • Kifejezések áthelyezése awaitutasításblokkokbóllock (CS1996). A zárolás megtartása közben az aszinkron felfüggesztés holtpontot jelent. A zárolás akkor is fennmarad, amikor szálváltások történnek, ahol más kód is ugyanarra a zárolásra vár.
  • Alakítsa át a lekérdezési kifejezéseket úgy, hogy await csak a kezdeti from záradék első gyűjteménykifejezésében vagy egy join záradék gyűjteménykifejezésében (CS1995) jelenjenek meg. Más lekérdezési záradékok lambda-kifejezésekké alakulnak, amelyek nem támogatják az aszinkron felfüggesztést.
  • Módosítsa a várt kifejezés típusát úgy, hogy egy GetAwaiter() metódust tegyen elérhetővé, amely a várómintát követi (CS1986, CS4028). A típus közvetlenül vagy bővítménymetódussal implementálhatja a mintát. Ha a GetAwaiter metódus létezik, de hiányzik egy using irányelv, Systema fordító a CS1986 helyett a pontosabb CS4028-üzenetet hozza létre.
  • Győződjön meg arról, hogy a GetAwaiter() által visszaadott várótípus rendelkezik IsCompleted, OnCompleted és GetResult tagokkal, valamint megvalósítja a INotifyCompletion vagy ICriticalNotifyCompletion interfészt (CS4011, CS4027). A await kifejezés ezektől a tagoktól függ a befejezési állapot ellenőrzéséhez, a folytatások regisztrálásához és az eredmények lekéréséhez.
  • Módosítsa a meghívott függvény visszatérési típusát void-ről Task-re vagy Task<TResult>-re, hogy az eredmény várható legyen (CS4008). Nem várhat meg egy void-értéket visszaadó metódust, mert nincs feladatobjektum a befejezés nyomon követésére vagy a kivételek továbbítására.
  • Módosítsa a várt kifejezést olyan típusra, amely támogatja a várómintát (CS4001). Az olyan típusok, mint a int, string, és más beépített típusok nem rendelkeznek a(z) GetAwaiter metódussal, és nem lehet őket közvetlenül várakozási állapotba helyezni.
  • A ref-returning metódushívás eredményét egy helyi változóban tárolja a használat await előtt (CS8178). A metódus által visszaadott hivatkozás nem őrizhető meg egy await határán, mert az aszinkron állapotgép különböző szálon vagy környezetben függesztheti fel és folytathatja, így a hivatkozás érvénytelenné válik.
  • Valósítsa meg a IAsyncEnumerable<T> a gyűjtemény típusán, vagy adjon hozzá egy elérhető GetAsyncEnumerator metódust, amely egy típust ad vissza Current és MoveNextAsync tagokkal (CS8411). Az await foreach utasítás megköveteli, hogy a gyűjtemény típusa kövesse az aszinkron számbavételi mintát.
  • Nevezze át a await metódusban vagy lambdakifejezésben (async) elnevezett helyi változót vagy paramétert. Az aszinkron környezetekben a await környezetfüggő kulcsszóként szerepel, ezért nem használható azonosítóként.
  • Helyezze át a kifejezést a await statikus szkriptváltozó inicializálóból és egy metódustörzsbe (CS8100). A statikus inicializálók aszinkron környezeten kívül futnak, ezért await nem érhetők el ezen a helyen.
  • Alakítsa át a kódot úgy, hogy a ref struct példányokat ne kelljen await vagy yield határokon (CS4007) megőrizni. Az aszinkron állapotú gép a halomon tárolja a helyi változókat, a ref struct típusokat pedig a tervezés köti össze – nem helyezhetők át biztonságosan a halomtárolóba a felfüggesztési pontok között.

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

  • CS1983: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek nem "T" típusúnak, hanem "Task<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ó.
  • CS8935: Az AsyncMethodBuilder attribútum explicit visszatérési típus nélkül nem engedélyezett a névtelen metódusokon.
  • CS8940: Általános feladathoz hasonló visszatérési típus várt, de az AsyncMethodBuilder attribútumban talált típus nem volt megfelelő. Kötetlen általános aritástípusnak kell lennie, és a benne található típusnak (ha van ilyen) nem általánosnak kell lennie.
  • CS8403: Az iterátorblokkot tartalmazó metódusnak a "async{1}" értéket kell visszaadnia.
  • CS9330: A "MethodImplAttribute.Async" nem alkalmazható manuálisan a metódusokra. Jelölje meg a ""async metódust.
  • CS4005: Az aszinkron metódusok nem rendelkeznek mutatótípus-paraméterekkel.
  • CS4006: __arglist nem engedélyezett az aszinkron metódusok paraméterlistájában.
  • CS4010: Az aszinkron lambda nem konvertálható delegált típussá. Az aszinkron lambda void, Task vagy Task<T>, amelyek egyike sem konvertálható visszatérési típussal.
  • CS4012: A típusparaméterek nem deklarálhatók aszinkron metódusokban vagy aszinkron lambdakifejezésekben.
  • CS4015: A "MethodImplOptions.Syncd" nem alkalmazható aszinkron metódusra.
  • CS4016: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek feladattípusúnak kell lennie, nem pedig típusnak.
  • CS8031: Az aszinkron lambda kifejezést, amely egy feladatot visszaadó delegálttá van alakítva, nem tud értéket visszaadni.
  • CS8204: A típus AsyncMethodBuilderként való használatához a Tevékenység tulajdonságnak a deklarált típus helyett a szükséges típust kell visszaadnia.

Az alábbi elemek bemutatják, hogyan lehet kijavítani az egyes hibákat. Az aszinkron metódus deklarációiról további információt a módosító és az asyncAsync visszatérési típusaiban talál.

  • Módosítsa a visszatérési kifejezést úgy, hogy megfeleljen az aszinkron metódus mögöttes eredménytípusának (CS1983, CS4016). Az aszinkron metódus visszaadásakor Task<T>, az return utasításnak egy T típusú értéket kell szolgáltatnia, nem Task<T> értéket, mert a fordító által létrehozott állapotgép automatikusan becsomagolja az értéket egy feladatba. A CS1983 akkor jelenik meg, amikor a metódus visszatér Task<T> , és a kifejezés ; TA CS4016 azt az általános esetet ismerteti, amikor a visszatérési kifejezés típusa nem egyezik meg.
  • Távolítsa el a módosítót olyan async metódusokból, amelyek nem rendelkeznek törzstel, például absztrakt metódusok vagy interfészmetódus-deklarációk (CS1994). A async módosítóhoz egy metódustörzsre van szükség, hogy a fordító létrehozhassa az állapotgép-implementációt.
  • Az aszinkron belépési pont visszatérési típusának módosítása Task vagy Task<TResult> (CS4009). A C# 7.1-től kezdve a Main metódus lehet async, de visszatérési értéke kell legyen Task vagy Task<int> - async void, mert az async int érvénytelen belépési pont aláírások.
  • Egy belépési pont eltávolítása vagy átnevezése, ha a projekt szinkron és aszinkron Main metódust (CS8892) is tartalmaz. A fordító kiválasztja a szinkron belépési pontot, és figyelmeztetést ad ki az figyelmen kívül hagyott aszinkron jelöltet illetően.
  • Adjon hozzá explicit visszatérési típust a lambda kifejezéshez az [AsyncMethodBuilder] attribútum (CS8935) alkalmazása előtt. A fordító nem tudja feloldani egy névtelen metódus szerkesztőtípusát, amelynek visszatérési típusa kikövetkeztetett, mert az attribútumnak egy adott visszatérési típussal kell egyeznie a fordításkor.
  • Módosítsa az [AsyncMethodBuilder] attribútumban megadott típust egy generikus, egy paraméterű kötetlen típusra, például MyTaskMethodBuilder<>, ahelyett hogy MyTaskMethodBuilder<T> vagy nem generikus típust használna (CS8940). Ha van ilyen, az építő tároló típusának is nem általánosnak kell lennie. A fordítónak szüksége van erre az alakzatra, hogy bármilyen konkrét feladathoz hasonló visszatérési típushoz összeállíthassa a szerkesztőt.
  • Cserélje le a manuális [MethodImpl(MethodImplOptions.Async)] attribútumot a async metódus deklarációján szereplő kulcsszóra (CS9330). A MethodImplOptions.Async jelölő belső futtatókörnyezeti használatra van fenntartva, és nem alkalmazható közvetlenül a felhasználói kódban.
  • Adja hozzá a async módosítót az iterátorblokkokat tartalmazó metódushoz, és adja vissza IAsyncEnumerable<T> vagy IAsyncEnumerator<T> (CS8403). A async módosító nélkül a fordító szinkron iterátorként kezeli a metódust, és nem tudja létrehozni az aszinkron streamállapot-gépet.
  • Távolítsa el a mutató típusú paramétereket az aszinkron metódusokból (CS4005). Az egérmutatók olyan rögzített memóriahelyeket mutatnak, amelyek nem őrizhetők meg biztonságosan az aszinkron felfüggesztési pontokon, ahol a végrehajtás egy másik szálon folytatódhat.
  • Eltávolítás __arglist az aszinkron metódusparaméter-listákból (CS4006). A változó hosszúságú argumentumlisták olyan veremalapú hívási konvencióktól függnek, amelyek nem kompatibilisek a halom által lefoglalt aszinkron állapotgéppel.
  • Távolítsa el az aszinkron metódusokból, illetve az aszinkron lambdakifejezésekből a ref, in vagy out paramétereket, valamint a ref struct típusú, például Span<T> vagy ReadOnlySpan<T> paramétereket (CS4012). Ezek a paramétertípusok veremhez kötöttek, és nem rögzíthetők biztonságosan a halomban lefoglalt aszinkron állapotgép lezárásában.
  • Módosítsa a céldelegált típusát úgy, hogy megfeleljen az aszinkron lambda visszatérési típusának (CS4010). Az aszinkron lambda visszaadhat void, Taskvagy Task<TResult>, és a fordító nem tudja átalakítani ezeket tetszőleges delegált típusokká, amelyek eltérő visszatérési típusokat várnak.
  • Távolítsa el a return kifejezést egy olyan aszinkron lambdából, amely nem általános Taskvisszaadott delegálthoz van rendelve, vagy módosítsa a delegálás típusát úgy, hogy Func<Task<T>> a lambda visszaadhassa az értéket (CS8031). A nem generikus Task-t visszaadó delegált egy eredmény nélküli aszinkron műveletet reprezentál, ezért az érték visszaadása típuskompatibilitási problémát okoz.
  • Távolítsa el az attribútumot az aszinkron [MethodImpl(MethodImplOptions.Synchronized)] metódusokból (CS4015). A Synchronized beállítás zárolást szerez a metódus egész végrehajtásához, de egy aszinkron metódus felfüggesztésre kerül és folytatódik potenciálisan eltérő szálakon, ami a zárolás szemantikáját meghatározatlanná teszi.
  • Javítsa ki az egyéni AsyncMethodBuilder típust, hogy a Task tulajdonsága ugyanazt a típust adja vissza, mint az async metódus deklarált visszatérési típusa (CS8204). A fordító az építő Task tulajdonságát használja a végső feladatobjektum megszerzéséhez, így a típuseltérés megakadályozza, hogy az állapotgép megfelelően működjön.

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.
  • CS8177: Az aszinkron metódusok nem rendelkeznek hivatkozási helyi adatokkal.
  • CS9123: A "&" operátor nem használható paramétereken vagy helyi változókon az aszinkron metódusokban.
  • CS4029: Nem adható vissza "void" típusú kifejezés.
  • CS4030: A biztonsági attribútum nem alkalmazható aszinkron metódusra.
  • CS4031: Az aszinkron metódusok nem engedélyezettek a SecurityCritical vagy SecuritySafeCritical attribútummal rendelkező interfészben, osztályban vagy struktúrában.

Az alábbi elemek bemutatják, hogyan lehet kijavítani az egyes hibákat. További információért lásd: Az aszinkron programozás az async és await kulcsszavakkal, valamint a await operátort.

  • Adja hozzá az await operátort minden olyan híváshoz, amely Task vagy Task<TResult> visszatér, vagy _ = explicit módon elveti az eredményt, ha a figyelmen kívül hagyás valóban szándékos (CS4014). Az await hiányában az aszinkron művelet által okozott bármilyen kivétel csendesen elveszik, és a hívó metódus még a művelet befejezése előtt folytatja a végrehajtást, ami finom sorrendi és helyességi hibákat okozhat.
  • Távolítsa el a return kifejezést egy olyan aszinkron metódusból, amelynek visszatérési típusa Task (nem általános), vagy módosítsa a visszatérési típust Task<T> arra az esetre, amikor a metódusnak értéket kell visszaadnia (CS1997). Egy Task-t visszaadó aszinkron metódusban a fordító létrehozza a feladatburkolót – értéket visszaadni típusbeli eltérés, mivel a metódus aláírása nem ígér eredményt.
  • Adjon hozzá legalább egy await kifejezést a metódus törzséhez, vagy távolítsa el a async módosítót, és adja vissza közvetlenül a feladatot (CS1998). A async kifejezések nélküli await metódusok teljes mértékben szinkron módon futnak, ami szükségtelen állapotgép-többletterhelést okoz. Ha a metódus szándékosan körbefuttat egy szinkron műveletet, a feladat eltávolítása async és visszaadása explicit módon megszünteti ezt a többletterhelést.
  • Írja át a lambda kifejezést, hogy ne használjaasync, ha egy olyan kifejezésfatípushoz van hozzárendelve, mint a Expression<Func<...>>(CS1989). A kifejezésfák olyan adatstruktúrákként jelölik a kódot, amelyeket a fordító elemezni vagy lefordítani tud, de az előállított összetett állapotgép async nem rögzíthető kifejezésfában.
  • Módosítsa az esemény implementációját, hogy a felület deklarációja és a implementálási osztály is megegyezhessen abban, hogy az esemény windowsos futtatókörnyezeti szemantikát vagy normál .NET-szemantikát (CS1991) használ-e. Ez a hiba olyan Windows-futtatókörnyezeti interop forgatókönyvekre vonatkozik, ahol a WinRT-esemény nem implementálható normál .NET-eseményként, vagy fordítva.
  • Távolítsa el az operátor (&) címét az aszinkron metódusokon (CS9123) belül paraméterekre vagy helyi változókra hivatkozó kifejezésekből. Az aszinkron állapotú gép a felfüggesztés során áthelyezheti a rögzített változókat a halomba, ami érvénytelenné tenné a cím alapján kapott mutatót.
  • Távolítsa el a helyi változókat az aszinkron metódusokból, vagy győződjön meg arról, hogy nem terjednek át egy await határon (CS8177). Az állapotgép aszinkron módban rögzíti a helyi változókat a heapben foglalt lezárásokban, és a veremhelyekre mutató hivatkozások nem őrizhetők meg biztonságosan a felfüggesztési pontok között. A C# 13-as és újabb verzióiban a lokális változók engedélyezettek az aszinkron metódusokban, amíg nem lépik át egy ref határon, és ez a hiba nem keletkezik.
  • Távolítsa el azt az utasítást, amely a return metódus eredményét adja vissza, vagy módosítsa a hívott metódust úgy, hogy az egy értéket (void) adjon vissza. Nem használható return SomeVoidMethod(); , mert void nem értékként visszaadható típus. Távolítsa el a kulcsszót return , és hívja meg a metódust önálló utasításként, vagy módosítsa a metódus aláírását egy konkrét típus visszaadásához.
  • Távolítsa el az aszinkron metódusokhoz ([SecurityCritical]) hasonló [SecuritySafeCritical] biztonsági attribútumokat, vagy távolítsa el a módosítót az async ezen attribútumokkal megjelölt típusok metódusaiból (CS4031). A kódhozzáférés biztonsági megjegyzései a deklarálási módszerre vonatkoznak, de a fordító által létrehozott aszinkron állapotú gép egy külön környezetben fut, ahol ezek a biztonsági megjegyzések nem kényszeríthetők ki.