Lösa fel och varningar i asynkrona metoder med hjälp av await-operatorn

Den här artikeln beskriver följande kompilatorfel:

  • CS1983: Eftersom det här är en asynkron metod måste returuttrycket vara av typen "Task<T>" i stället för "T".
  • CS1985: Det går inte att använda 'await' i en catch-sats.
  • CS1986: "await" kräver att typen har en lämplig "GetAwaiter"-metod.
  • CS1989: Async lambda-uttryck kan inte konverteras till uttrycksträd.
  • CS1991: "Typ" kan inte implementera "händelse" eftersom det är en Windows Runtime-händelse och "händelse" är en vanlig .NET-händelse.
  • CS1992: Operatorn "await" kan endast användas när den finns i en metod eller ett lambda-uttryck som har markerats med "async"-modifieraren.
  • CS1994: Modifieraren kanasync bara användas i metoder som har en brödtext.
  • CS1995: Operatorn "await" får endast användas i ett frågeuttryck i det första samlingsuttrycket för den inledandefrom satsen eller i samlingsuttrycket för en "join"-sats.
  • CS1996: Det går inte att använda 'await' inom en låssats.
  • CS1997: Eftersom funktionen är en asynkron metod som returnerar ett värde får ett returnyckelord inte följas av ett objektuttryck.
  • CS1998: Den här asynkrona metoden saknar operatorerawait och körs synkront. Överväg att använda operatorn "await" för att vänta på icke-blockerande API-anrop, eller "await Task.Run(...)" för att utföra CPU-bundet arbete på en bakgrundstråd.
  • CS4008: Kan inte invänta 'void'.
  • CS4009: En ogiltig eller int returnerande startpunkt kan inte vara asynkron.
  • CS4014: Eftersom det här anropet inte vänts på, fortsätter utförandet av den aktuella metoden innan anropet har slutförts. Använd gärna operatorn await på resultatet av anropet.
  • CS4032: Operatorn 'await' kan endast användas inom en asynkron metod. Överväg att markera den här metoden med modifieraren "async" och ändra dess returtyp till "Task<T>".
  • CS4033: Operatorn 'await' kan endast användas inom en asynkron metod. Överväg att markera den här metoden med modifierarenasync och ändra dess returtyp till .Task
  • CS8892: Metoden används inte som startpunkt eftersom en synkron startpunkt hittades.
  • CS9123: Operatorn '&' ska inte användas på parametrar eller lokala variabler i asynkrona metoder.
  • CS9330: 'MethodImplAttribute.Async' kan inte tillämpas manuellt på metoder. Markera metoden "async".

Krav för Await-uttryck

  • CS1985: Det går inte att använda await i en catch-sats.
  • CS1986: "await" kräver att typen har en lämplig "GetAwaiter"-metod.
  • CS1992: Operatorn "await" kan endast användas när den finns i en metod eller ett lambda-uttryck som har markerats med modifieraren .async
  • CS1995: Operatorn "await" får endast användas i ett frågeuttryck i det första samlingsuttrycket för den inledandefrom satsen eller i samlingsuttrycket för en "join"-sats.
  • CS1996: Det går inte att använda await i en lock-sats.
  • CS4008: Kan inte invänta 'void'.
  • CS4032: Operatorn 'await' kan endast användas inom en asynkron metod. Överväg att markera den här metoden med modifierarenasync och ändra dess returtyp till .Task<T>
  • CS4033: Operatorn 'await' kan endast användas inom en asynkron metod. Överväg att markera den här metoden med modifierarenasync och ändra dess returtyp till .Task

Följ dessa regler om du vill använda operatorn await korrekt. För mer information, se Asynkron programmering med asynk och vänt.

  • Använd inte await i catch-satser (CS1985). Även om du kan använda await i try-block och finally-block (i C# 6 och senare), medför catch-block särskilda utmaningar med undantagshantering och kontrollflöde.
  • Använd inte await invändigt i lock satsblock (CS1996). Kompilatorn stöder inte detta för att undvika att kod som är utsatt för dödlägen genereras.
  • Använd await endast på specifika platser i frågeuttryck (CS1995): i det första samlingsuttrycket för den inledande from satsen eller i samlingsuttrycket för en join sats.
  • Markera metoder eller lambda-uttryck med async modifieraren innan du använder await (CS1992, CS4032, CS4033).
  • Se till att väntande typer har en tillgänglig GetAwaiter metod som returnerar en awaiter-typ (CS1986).
  • Gäller await inte för uttryck av typen void (CS4008).
  • Ändra returtypen till Task för metoder som inte returnerar ett värde eller Task<T> för metoder som returnerar ett värde.

Krav för asynkron metodsignatur

  • CS1983: Eftersom det här är en asynkron metod måste returuttrycket vara av typen "Task<T>" i stället för "T".
  • CS1994: Modifieraren kanasync bara användas i metoder som har en brödtext.
  • CS4009: En ogiltig eller int returnerande startpunkt kan inte vara asynkron.
  • CS8892: Metoden används inte som startpunkt eftersom en synkron startpunkt hittades.
  • CS9330: 'MethodImplAttribute.Async' kan inte tillämpas manuellt på metoder. Markera metoden .async

Följ dessa signaturkrav om du vill deklarera asynkrona metoder korrekt. Mer information finns i Asyncs huvudreturvärden.

  • Returnera någon av de giltiga typerna: void, Task, Task<T>, en aktivitetsliknande typ, IAsyncEnumerable<T>eller IAsyncEnumerator<T> (CS1983).
  • async Använd modifieraren endast på metoder med en brödtext (CS1994). async Ta bort modifieraren på abstrakta metoder i gränssnitt eller klasser.
  • Uppdatera till C# 7.1 eller senare för att använda asyncMain-startpunkten, eller att undvika att använda async på startpunkter i tidigare versioner (CS4009).
  • Ta bort synkrona startpunkter om du har både synkroniserings- och asynkrona startpunkter (CS8892).
  • Använd nyckelordet async i stället för att tillämpa MethodImplAttribute.Async manuellt (CS9330).

Asynkrona metoder

  • CS1989: Async lambda-uttryck kan inte konverteras till uttrycksträd.
  • CS1991: "Typ" kan inte implementera "händelse" eftersom det är en Windows Runtime-händelse och "händelse" är en vanlig .NET-händelse.
  • CS1997: Eftersom funktionen är en asynkron metod som returnerar ett värde får ett returnyckelord inte följas av ett objektuttryck.
  • CS1998: Den här asynkrona metoden saknar operatorerawait och körs synkront. Överväg att använda operatorn "await" för att vänta på icke-blockerande API-anrop, eller "await Task.Run(...)" för att utföra CPU-bundet arbete på en bakgrundstråd.
  • CS4014: Eftersom det här anropet inte väntas in, fortsätter den aktuella metoden utan att vänta på att anropet ska slutföras. Överväg att tillämpa operatorn await på resultatet av anropet.
  • CS9123: Operatorn '&' ska inte användas på parametrar eller lokala variabler i asynkrona metoder.

Följ dessa metodtips för att skriva asynkron kod korrekt och undvika vanliga fallgropar. För mer information, se Asynkron programmering med asynk och vänt.

  • Vänta alltid på anrop till asynkrona metoder som returnerar Task eller Task<TResult> (CS4014). Oväntade anrop kan leda till missade undantag och oförutsägbart beteende.
  • Returnera inte ett värde från asynkrona metoder som returnerar Task (icke-generiska), använd Task<T> i stället (CS1997).
  • Inkludera minst en await operator i asynkrona async metoder eller ta bort modifieraren (CS1998).
  • Ta bort -instruktionen return om metoden ska returnera Task (CS1997, CS1998).
  • Ändra metodens returtyp till Task<T> för att returnera ett värde (CS1997, CS1998).
  • async Ta bort modifieraren och returnera uppgiften direkt om du inte behöver asynkron tillståndsdatorn (CS1997, CS1998).
  • Använd inte asynkrona metoder i uttrycksträd (CS1989). Uttrycksträd representerar kod som data och stöder inte de komplexa tillståndsdatortransformeringar som krävs av asynkrona metoder.
  • Markera inte accessorer för tillägg eller borttagning i ett gränssnitt eller WinRT-händelse som asynkrona (CS1991). Det här är en plattformsspecifik begränsning för Windows Runtime-samverkan.
  • Undvik att använda adress för operatorn (&) på uttryck i asynkrona metoder (CS9123). Målet kan flyttas i minnet under avstängningen, vilket gör pekaren ogiltig.