Delen via


Fouten en waarschuwingen in asynchrone methoden oplossen met behulp van de wachtoperator

In dit artikel worden de volgende compilerfouten behandeld:

  • CS1983: Aangezien dit een asynchrone methode is, moet de retourexpressie van het type 'Task<T>' in plaats van 'T' zijn.
  • CS1985: Kan niet worden gebruikt in een catch-blok.
  • CS1986: 'await' vereist dat het type een geschikte methodeGetAwaiter heeft.
  • CS1989: Async lambda-expressies kunnen niet worden geconverteerd naar expressiestructuren.
  • CS1991: 'Type' kan gebeurtenis niet implementeren omdat het een Windows Runtime-gebeurtenis is en 'gebeurtenis' een reguliere .NET-gebeurtenis is.
  • CS1992: De operator 'await' kan alleen worden gebruikt in een methode of lambda-expressie die is gemarkeerd met de wijzigingsfunctie 'async'.
  • CS1994: De modifier 'async' kan alleen worden gebruikt in methoden met een hoofdtekst.
  • CS1995: De operator 'await' mag alleen worden gebruikt in een query-expressie binnen de eerste verzamelingsexpressie van de eerste component 'from' of in de verzamelingsexpressie van een 'join-component.
  • CS1996: Kan niet wachten in de hoofdtekst van een vergrendelingsinstructie.
  • CS1997: Omdat de functie een asynchrone methode is die een waarde retourneert, mag een retourwoord niet worden gevolgd door een objectexpressie.
  • CS1998: Deze asynchrone methode mist operatorsawait en wordt synchroon uitgevoerd. U kunt de operator 'await' gebruiken om niet-blokkerende API-aanroepen te wachten of 'await Task.Run(...)' om CPU-afhankelijk werk uit te voeren op een achtergrondthread.
  • CS4008: Kan niet wachten op 'void'.
  • CS4009: Een ongeldige of niet-geretourneerde ingangspunt kan niet asynchroon zijn.
  • CS4014: Omdat deze aanroep niet wordt gewacht, gaat de uitvoering van de huidige methode door voordat de aanroep is voltooid. Overweeg de await operator toe te passen op het resultaat van de aanroep.
  • CS4032: De operator 'await' kan alleen worden gebruikt binnen een asynchrone methode. U kunt deze methode markeren met de wijzigingsfunctie 'async' en het retourtype wijzigen in 'Task<T>'.
  • CS4033: De operator 'await' kan alleen worden gebruikt binnen een asynchrone methode. Overweeg deze methode te markeren met de modifier 'async' en het retourtype te wijzigen in 'Task'.
  • CS8892: Methode wordt niet gebruikt als invoerpunt omdat er een synchroon toegangspunt is gevonden.
  • CS9123: De operator '&' mag niet worden gebruikt voor parameters of lokale variabelen in asynchrone methoden.
  • CS9330: 'MethodImplAttribute.Async' kan niet handmatig worden toegepast op methoden. Markeer de methode 'async'.

Vereisten voor await-expressies

  • CS1985: Kan niet awaiten in een catch-blok.
  • CS1986: 'await' vereist dat het type een geschikte methodeGetAwaiter heeft.
  • CS1992: De operator 'await' kan alleen worden gebruikt wanneer deze zich in een methode of lambda-expressie bevindt die is gemarkeerd met deasync ''-wijzigingsfunctie.
  • CS1995: De operator 'await' mag alleen worden gebruikt in een query-expressie binnen de eerste verzamelingsexpressie van de eerste component 'from' of in de verzamelingsexpressie van een 'join-component.
  • CS1996: Kan geen 'await' gebruiken in de body van een lock-instructie.
  • CS4008: Kan niet wachten op 'void'.
  • CS4032: De operator 'await' kan alleen worden gebruikt binnen een asynchrone methode. Overweeg deze methode te markeren met de modifier 'async' en het retourtype te wijzigen in 'Task<T>'.
  • CS4033: De operator 'await' kan alleen worden gebruikt binnen een asynchrone methode. Overweeg deze methode te markeren met de modifier 'async' en het retourtype te wijzigen in 'Task'.

Als u de await operator correct wilt gebruiken, volgt u deze regels. Zie voor meer informatie Asynchrone programmering met async en await.

  • Gebruik niet await in catch-componenten (CS1985). Hoewel u await in try-blokken en finally-blokken (in C# 6 en hoger) kunt gebruiken, vormen catch-blokken speciale uitdagingen met uitzonderingsafhandeling en besturingsstroom.
  • Gebruik geen binnen statement blokken (CS1996). De compiler ondersteunt dit niet om te voorkomen dat het code genereert die vatbaar is voor deadlocks.
  • Gebruik await alleen op specifieke locaties binnen query-expressies (CS1995): binnen de eerste verzamelingsexpressie van de initiële from component of binnen de verzamelingsexpressie van een join component.
  • Markeer methoden of lambda-expressies met de async modifier voordat u await (CS1992, CS4032, CS4033) gebruikt.
  • Zorg ervoor dat awaited types een toegankelijke GetAwaiter methode hebben die een awaiter type retourneert (CS1986).
  • Niet van toepassing op await expressies van het type void (CS4008).
  • Wijzig het retourtype in Task voor methoden die geen waarde retourneren of Task<T> voor methoden die een waarde retourneren.

Handtekeningvereisten voor Async-methode

  • CS1983: Aangezien dit een asynchrone methode is, moet de retourexpressie van het type 'Task<T>' in plaats van 'T' zijn.
  • CS1994: De modifier 'async' kan alleen worden gebruikt in methoden met een hoofdtekst.
  • CS4009: Een ongeldige of niet-geretourneerde ingangspunt kan niet asynchroon zijn.
  • CS8892: Methode wordt niet gebruikt als invoerpunt omdat er een synchroon toegangspunt is gevonden.
  • CS9330: 'MethodImplAttribute.Async' kan niet handmatig worden toegepast op methoden. Markeer de methode 'async'.

Als u asynchrone methoden correct wilt declareren, volgt u deze handtekeningvereisten. Zie voor meer informatie Async main-retourwaarden.

  • Retourneert een van de geldige typen: void, Task, Task<T>een taakachtig type, IAsyncEnumerable<T>of IAsyncEnumerator<T> (CS1983).
  • Gebruik de async modifier alleen op methoden met een hoofdtekst (CS1994). Verwijder de async modifier voor abstracte methoden in interfaces of klassen.
  • Werk bij naar C# 7.1 of hoger om te gebruiken async op het Main toegangspunt of vermijd het gebruik async van toegangspunten in eerdere versies (CS4009).
  • Verwijder synchrone toegangspunten als u zowel synchronisatie- als asynchrone toegangspunten (CS8892) hebt.
  • Gebruik het async trefwoord in plaats van handmatig toe te passen MethodImplAttribute.Async (CS9330).

Asynchrone praktijken

  • CS1989: Asynchrone lambda-expressies kunnen niet worden omgezet naar expressiebomen.
  • CS1991: 'Type' kan gebeurtenis niet implementeren omdat het een Windows Runtime-gebeurtenis is en 'gebeurtenis' een reguliere .NET-gebeurtenis is.
  • CS1997: Omdat de functie een asynchrone methode is die een waarde retourneert, mag een retourwoord niet worden gevolgd door een objectexpressie.
  • CS1998: Deze asynchrone methode mist operatorsawait en wordt synchroon uitgevoerd. U kunt de operator 'await' gebruiken om niet-blokkerende API-aanroepen te wachten of 'await Task.Run(...)' om CPU-afhankelijk werk uit te voeren op een achtergrondthread.
  • CS4014: Omdat deze aanroep niet wordt gewacht, gaat de uitvoering van de huidige methode door voordat de aanroep is voltooid. Overweeg de await operator toe te passen op het resultaat van de aanroep.
  • CS9123: De operator '&' mag niet worden gebruikt voor parameters of lokale variabelen in asynchrone methoden.

Volg deze aanbevolen procedures om asynchrone code correct te schrijven en veelvoorkomende valkuilen te voorkomen. Zie voor meer informatie Asynchrone programmering met async en await.

  • Wacht altijd op oproepen naar asynchrone methoden die Task of Task<TResult> retourneren (CS4014). Niet-geopende aanroepen kunnen leiden tot verloren uitzonderingen en onverwacht gedrag.
  • Retourneer geen waarde van asynchrone methoden die retourneren Task (niet-algemeen); gebruik Task<T> in plaats daarvan (CS1997).
  • Neem ten minste één await operator op in asynchrone methoden of verwijder de async modifier (CS1998).
  • Verwijder de return verklaring als de methode Task moet teruggeven (CS1997, CS1998).
  • Wijzig het retourtype van de methode om Task<T> een waarde te retourneren (CS1997, CS1998).
  • Verwijder de async wijzigingsfunctie en retourneer de taak rechtstreeks als u de asynchrone statusmachine (CS1997, CS1998) niet nodig hebt.
  • Gebruik geen asynchrone methoden in expressiestructuren (CS1989). Expressiestructuren vertegenwoordigen code als gegevens en bieden geen ondersteuning voor de complexe statusmachinetransformaties die vereist zijn voor asynchrone methoden.
  • Markeer geen toe- of afvoegaccessors in een interface of WinRT-gebeurtenis als asynchroon (CS1991). Dit is een platformspecifieke beperking voor windows Runtime-interoperabiliteit.
  • Vermijd het gebruik van het adres van de operator (&) voor expressies in asynchrone methoden (CS9123). Het doel kan tijdens de schorsing in het geheugen worden verplaatst, waardoor de aanwijzer ongeldig wordt.