Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel werden die folgenden Compilerfehler behandelt:
-
CS1983: Da es sich um eine asynchrone Methode handelt, muss der Rückgabeausdruck vom Typ '
T' statt 'Task<T>' sein. - CS1985: In einer Catch-Klausel kann nicht gewartet werden.
-
CS1986: '
await' erfordert, dass der Typ über eine geeignete 'GetAwaiter' Methode verfügt. - CS1989: Async Lambda-Ausdrücke können nicht in Ausdrucksbäume konvertiert werden.
- CS1991: "Type" kann "event" nicht implementieren, da es sich um ein Windows-Runtime-Ereignis handelt und "event" ein reguläres .NET-Ereignis ist.
-
CS1992: Der Operator '
await' kann nur verwendet werden, wenn er in einer Methode oder einem Lambda-Ausdruck enthalten ist, der mit dem Modifizierer "asynchron" gekennzeichnet ist. -
CS1994: Der Modifizierer "
async" kann nur in Methoden verwendet werden, die über einen Textkörper verfügen. -
CS1995: Der Operator '
await' darf nur in einem Abfrageausdruck innerhalb des ersten Sammlungsausdrucks der anfänglichen 'from' Klausel oder innerhalb des Sammlungsausdrucks einer 'join' Klausel verwendet werden. - CS1996: Im Textkörper einer Lock-Anweisung kann nicht gewartet werden.
- CS1997: Da es sich bei der Funktion um eine asynchrone Methode handelt, die einen Wert zurückgibt, darf auf ein Rückgabeschlüsselwort kein Objektausdruck folgen.
-
CS1998: Diese asynchrone Methode enthält keine '
await' Operatoren und wird synchron ausgeführt. Erwägen Sie die Verwendung des Operators "await", um nicht blockierende API-Aufrufe zu erwarten, oder "await Task.Run(...)", um CPU-gebundene Arbeit in einem Hintergrundthread auszuführen. - CS4001: Der Ausdruck kann nicht erwartet werden.
-
CS4003: '
await' kann nicht als Bezeichner innerhalb einer asynchronen Methode oder eines Lambda-Ausdrucks verwendet werden. - CS4005: Async-Methoden können keine Zeigertypparameter haben.
- CS4006: __arglist ist in der Parameterliste der asynchronen Methoden nicht zulässig.
-
CS4007: Instanz des Typs kann nicht über die Grenze "
await" oder "yield" beibehalten werden. -
CS4008: Es kann nicht auf '
void' gewartet werden. - CS4009: Ein leerer oder int-Rückgabepunkt kann nicht asynchron sein.
- CS4010: Asynchroner Ausdruck kann nicht in Stellvertretungstyp konvertiert werden. Ein asynchroner Ausdruck kann "void", "Task T" oder "Task<T>" zurückgeben, von denen keiner in den Typ wandelbar ist.
-
CS4011: '
await' erfordert, dass der Rückgabetyp '{1}. GetAwaiter()" verfügen über geeignete "IsCompleted"-, "OnCompleted"- und "GetResult"-Member und implementieren "INotifyCompletion" oder "ICriticalNotifyCompletion". - CS4012: Parameter vom Typ können nicht in asynchronen Methoden oder asynchronen Lambda-Ausdrücken deklariert werden.
-
CS4014: Da dieser Aufruf nicht erwartet wird, wird die Ausführung der aktuellen Methode fortgesetzt, bevor der Aufruf abgeschlossen ist. Erwägen Sie, den
awaitOperator auf das Ergebnis des Anrufs anzuwenden. - CS4015: 'MethodImplOptions.Synchronized' kann nicht auf eine asynchrone Methode angewendet werden.
- CS4016: Da es sich um eine asynchrone Methode handelt, muss der Rückgabeausdruck von einem aufgabenähnlichen Typ sein, anstatt vom deklarierten Typ.
- CS4027: Der Ausdruckstyp implementiert kein erforderliches Element.
-
CS4028: "
await" erfordert, dass der Typ über eine geeignete GetAwaiter-Methode verfügt. Fehlt ihnen eine Verwendungsdirektive für "System"? - CS4029: Ein Ausdruck vom Typ 'void' kann nicht zurückgegeben werden.
- CS4030: Das Sicherheitsattribute kann nicht auf eine Async-Methode angewendet werden.
- CS4031: Async-Methoden sind in einer Schnittstelle, Klasse oder Struktur mit dem Attribut "SecurityCritical" oder "SecuritySafeCritical" nicht zulässig.
-
CS4032: Der Operator '
await' kann nur innerhalb einer asynchronen Methode verwendet werden. Erwägen Sie, diese Methode mit dem Modifizierer "asynchron" zu markieren und den Rückgabetyp in "Task<T>" zu ändern. -
CS4033: Der Operator '
await' kann nur innerhalb einer asynchronen Methode verwendet werden. Erwägen Sie, diese Methode mit dem Modifizierer "async" zu markieren und den Rückgabetyp in "Task" zu ändern. -
CS4034: Der Operator '
await' kann nur innerhalb einer asynchronen Methode verwendet werden. Erwägen Sie das Markieren dieser Methode mit dem Modifizierer "asynchron". - CS8031: Eine asynchrone Lambda-Ausdruck, der in einen Task zurückgebenden Delegaten konvertiert wurde, kann keinen Wert zurückgeben.
-
CS8100: Der Operator '
await' kann nicht in einem statischen Skriptvariableninitialisierer verwendet werden. - CS8177: Asynchrone Methoden können keine lokalen Variablen als Referenz verwenden.
-
CS8178: Ein verweis, der von einem Aufruf der Methode zurückgegeben wird, kann nicht über die Grenze "
await" oder "yield" beibehalten werden. - CS8204: Damit der Typ als AsyncMethodBuilder für das Typziel verwendet werden kann, sollte seine Task-Eigenschaft den Zieltyp anstelle des deklarierten Typs zurückgeben.
-
CS8403: Die Methode mit einem Iteratorblock muss '
async' sein, um IAsyncEnumerable<T> zurückzugeben. - CS8411: Die asynchrone Foreach-Anweisung kann nicht auf Variablen des Typs ausgeführt werden, da der Typ keine geeignete öffentliche Instanz oder Erweiterungsdefinition für erforderliche Member enthält.
- CS8892: Die Methode wird nicht als Einstiegspunkt verwendet, da ein synchroner Einstiegspunkt gefunden wurde.
- CS8935: Das AsyncMethodBuilder-Attribut ist für anonyme Methoden ohne expliziten Rückgabetyp unzulässig.
- CS8940: Ein generischer, taskähnlicher Rückgabetyp wurde erwartet, aber der Typ, der im Attribut "AsyncMethodBuilder" gefunden wurde, war nicht geeignet. Es muss sich um einen ungebundenen generischen Typ von Arität eins handeln, und sein umfassender Typ (falls vorhanden) muss nicht generisch sein.
-
CS9123: Der Operator "
&" sollte nicht für Parameter oder lokale Variablen in asynchronen Methoden verwendet werden. -
CS9330: '
MethodImplAttribute.Async' kann nicht manuell auf Methoden angewendet werden. Markieren Sie die Methode "async".
Anforderungen für den Await-Ausdruck
- CS1985: In einer Catch-Klausel kann nicht gewartet werden.
-
CS1986: '
await' erfordert, dass der Typ über eine geeignete 'GetAwaiter' Methode verfügt. -
CS1992: Der Operator "
await" kann nur verwendet werden, wenn er in einer Methode oder einem Lambda-Ausdruck enthalten ist, der mit dem Modifizierer "async" gekennzeichnet ist. -
CS1995: Der Operator '
await' darf nur in einem Abfrageausdruck innerhalb des ersten Sammlungsausdrucks der anfänglichen 'from' Klausel oder innerhalb des Sammlungsausdrucks einer 'join' Klausel verwendet werden. - CS1996: Im Textkörper einer Lock-Anweisung kann nicht gewartet werden.
-
CS4008: Es kann nicht auf '
void' gewartet werden. -
CS4032: Der Operator '
await' kann nur innerhalb einer asynchronen Methode verwendet werden. Erwägen Sie, diese Methode mit dem Modifizierer "async" zu markieren und den Rückgabetyp in "Task<T>" zu ändern. -
CS4033: Der Operator '
await' kann nur innerhalb einer asynchronen Methode verwendet werden. Erwägen Sie, diese Methode mit dem Modifizierer "async" zu markieren und den Rückgabetyp in "Task" zu ändern. -
CS4034: Der Operator '
await' kann nur innerhalb einer asynchronen Methode verwendet werden. Erwägen Sie das Markieren dieser Methode mit dem Modifizierer "asynchron". -
CS8178: Ein von diesem Aufruf zurückgegebener Verweis kann nicht über die Grenze '
await' oder 'yield' beibehalten werden. - CS8411: Eine asynchrone foreach-Anweisung kann nicht auf Variablen des Typs ausgeführt werden, da der Typ keine geeignete öffentliche Instanz- oder Erweiterungsdefinition für die erforderlichen Members enthält.
- CS4001: Der Ausdruck kann nicht erwartet werden.
-
CS4003: '
await' kann nicht als Bezeichner innerhalb einer asynchronen Methode oder eines Lambda-Ausdrucks verwendet werden. -
CS4007: Instanz des Typs kann nicht über die Grenze "
await" oder "yield" beibehalten werden. -
CS4011: "
await" erfordert, dass der Rückgabetyp von "GetAwaiter()" über die geeigneten 'IsCompleted'-, 'OnCompleted'- und 'GetResult'-Member verfügt und "INotifyCompletion" oder "ICriticalNotifyCompletion" implementiert. - CS4027: Typ implementiert kein erforderliches Element.
-
CS4028: "
await" erfordert, dass der Typ über eine geeignete GetAwaiter-Methode verfügt. Fehlt ihnen eine Verwendungsdirektive für "System"? -
CS8100: Der Operator '
await' kann nicht in einem statischen Skriptvariableninitialisierer verwendet werden.
In den folgenden Elementen wird erläutert, wie die einzelnen Fehler korrigiert werden. Weitere Informationen zum await Operator und zum Awaiter-Muster finden Sie unter "Asynchrone Programmierung mit async und await".
- Fügen Sie den
asyncModifizierer der Methode oder des Lambda-Ausdrucks hinzu, der denawaitAusdruck enthält (CS1992, CS4032, CS4033, CS4034). Der Compiler erfordert denasyncModifizierer, damit er den Zustandsautomat generieren kann, der asynchrones Anhalten und Fortsetzen verarbeitet. Die drei Varianten dieses Fehlers stellen kontextspezifische Vorschläge für den richtigen Rückgabetyp bereit. - Verschieben Sie
awaitAusdrücke auscatchBlöcken, wenn Sie C# 5 oder früher anvisieren (CS1985). Ab C# 6 unterstütztawaitder Compiler sowohl alscatchfinallyauch Blöcke. Dieser Fehler wird in C# 6 und höher nicht mehr erstellt. - Verschieben von
awaitlockAusdrücken aus Anweisungsblöcken (CS1996). Asynchrones Anhalten beim Halten einer Sperre riskiert Deadlocks. Die Sperre wird über Threadschalter hinweg gehalten, bei denen möglicherweise anderer Code auf dieselbe Sperre wartet. - Strukturieren Sie Abfrageausdrücke so, dass
awaitnur im ersten Auflistungsausdruck der anfänglichenfromKlausel oder im Auflistungsausdruck einerjoinKlausel (CS1995) vorkommt. Andere Abfrageklauseln werden in Lambda-Ausdrücke übersetzt, die keine asynchrone Aussetzung unterstützen. - Ändern Sie den Typ des erwarteten Ausdrucks so, dass er eine barrierefreie
GetAwaiter()Methode verfügbar macht, die dem Awaiter-Muster folgt (CS1986, CS4028). Der Typ kann das Muster direkt oder über eine Erweiterungsmethode implementieren. Wenn dieGetAwaiter-Methode vorhanden ist, aber eineusing-Direktive fürSystemfehlt, erzeugt der Compiler die spezifischere CS4028-Nachricht anstelle der CS1986. - Stellen Sie sicher, dass der von
GetAwaiter()zurückgegebene Awaiter-Typ über die MitgliederIsCompleted,OnCompletedundGetResultverfügt und INotifyCompletion oder ICriticalNotifyCompletion implementiert (CS4011, CS4027). DerawaitAusdruck hängt von diesen Mitgliedern ab, um den Abschlussstatus zu überprüfen. Außerdem dient er dazu, Fortsetzungen zu registrieren und Ergebnisse abzurufen. - Ändern Sie den Rückgabetyp der aufgerufenen Methode von
voidzu Task oder Task<TResult> so kann das Ergebnis erwartet werden (CS4008). Sie können nicht auf einevoid-zurückgebende Methode warten, da kein Aufgabenobjekt vorhanden ist, um den Abschluss oder Ausnahmen nachzuverfolgen. - Ändern Sie den erwarteten Ausdruck in einen Typ, der das Awaiter-Muster (CS4001) unterstützt. Typen wie
int,stringund andere integrierte Typen verfügen nicht über eineGetAwaiterMethode und können nicht direkt erwartet werden. - Speichern Sie das Ergebnis eines Rückrufmethodenaufrufs in einer lokalen Variablen vor der Verwendung
await(CS8178). Ein von einer Methode zurückgegebener Verweis kann nicht über eineawait-Grenze hinweg beibehalten werden, da der asynchrone Zustandsautomat möglicherweise in einem anderen Thread oder Kontext angehalten und fortgesetzt wird, wodurch der Verweis ungültig wird. - Implementieren Sie IAsyncEnumerable<T> im Auflistungstyp oder fügen Sie eine zugängliche
GetAsyncEnumerator-Methode hinzu, die einen Typ mitCurrent- undMoveNextAsync-Mitgliedern zurückgibt (CS8411). Dieawait foreachAnweisung erfordert, dass der Sammlungstyp dem asynchronen Aufzählungsmuster folgt. - Benennen Sie jede lokale Variable oder jeden Parameter
awaitin einer Methode oder einem Lambda-Ausdruckasyncum (CS4003). In asynchronen Kontexten handelt es sich um ein kontextbezogenesawaitSchlüsselwort und kann nicht als Bezeichner verwendet werden. - Verschieben Sie den
awaitAusdruck aus dem Initialisierer der statischen Skriptvariable und in einen Methodenkörper (CS8100). Statische Initialisierer werden außerhalb eines asynchronen Kontexts ausgeführt, somit istawaitan diesem Ort nicht verfügbar. - Strukturieren Sie den Code um, sodass
ref struct-Instanzen nicht über eineawait- oderyield-Grenze hinweg beibehalten werden müssen (CS4007). Der asynchrone Zustandsautomat speichert lokale Variablen auf dem Heap, undref structTypen sind vom Entwurf stapelgebunden – sie können nicht sicher in den Heapspeicher über Anhaltepunkte verschoben werden.
Async-Methodensignaturanforderungen
-
CS1983: Da es sich um eine asynchrone Methode handelt, muss der Rückgabeausdruck vom Typ 'T' statt '
Task<T>' sein. -
CS1994: Der Modifizierer "
async" kann nur in Methoden verwendet werden, die über einen Textkörper verfügen. - CS4009: Ein leerer oder int-Rückgabepunkt kann nicht asynchron sein.
- CS8892: Die Methode wird nicht als Einstiegspunkt verwendet, da ein synchroner Einstiegspunkt gefunden wurde.
- CS8935: Das AsyncMethodBuilder-Attribut ist für anonyme Methoden ohne expliziten Rückgabetyp unzulässig.
- CS8940: Ein generischer taskähnlicher Rückgabetyp wurde erwartet, aber der Typ, der im Attribut „AsyncMethodBuilder“ gefunden wurde, war nicht geeignet. Es muss sich um einen ungebundenen generischen Typ von Arität eins handeln, und dessen enthaltender Typ, falls vorhanden, darf nicht generisch sein.
-
CS8403: Die Methode mit einem Iteratorblock muss '
async' sein, um '{1}' zurückzugeben. -
CS9330: '
MethodImplAttribute.Async' kann nicht manuell auf Methoden angewendet werden. Markieren Sie die Methode "async". - CS4005: Async-Methoden können keine Zeigertypparameter haben.
- CS4006: __arglist ist in der Parameterliste der asynchronen Methoden nicht zulässig.
- CS4010: Asynchrones Lambda kann nicht in Delegattyp konvertiert werden. Eine asynchrone Lambda-Funktion kann "void", "Task" oder "Task<T>" zurückgeben, von denen keiner in den Rückgabetyp konvertierbar ist.
- CS4012: Parameter vom Typ können nicht in asynchronen Methoden oder asynchronen Lambda-Ausdrücken deklariert werden.
- CS4015: 'MethodImplOptions.Synchronized' kann nicht auf eine asynchrone Methode angewendet werden.
- CS4016: Da es sich um eine asynchrone Methode handelt, muss der Rückgabeausdruck vom Aufgabentyp und nicht vom Typ sein.
- CS8031: Asynchrone Lambda-Ausdruck, der in einen delegierten Rückgabewert umgewandelt wird, kann keinen Wert zurückgeben.
- CS8204: Damit der Typ als AsyncMethodBuilder für den Typ verwendet werden kann, sollte seine Task-Eigenschaft den erforderlichen Typ anstelle des deklarierten Typs zurückgeben.
In den folgenden Elementen wird erläutert, wie die einzelnen Fehler korrigiert werden. Weitere Informationen zu asynchronen Methodendeklarationen finden Sie unter den async Modifizierer- und Async-Rückgabetypen.
- Ändern Sie den Rückgabeausdruck so, dass er dem zugrunde liegenden Ergebnistyp der asynchronen Methode entspricht (CS1983, CS4016). Wenn eine asynchrone Methode
Task<T>zurückgibt, muss diereturnAnweisung einen Wert vom TypTangeben, nichtTask<T>, da der vom Compiler generierte Zustandsautomat den Wert automatisch in einem Task umschließt. CS1983 wird angezeigt, wenn die Methode einen WertTask<T>zurückgibt und der AusdruckTist; CS4016 behandelt den allgemeinen Fall, in dem der Typ des Rückgabeausdrucks nicht übereinstimmt. - Entfernen Sie den
asyncModifizierer aus Methoden, die keinen Text haben, z. B. abstrakte Methoden oder Schnittstellenmethodendeklarationen (CS1994). DerasyncModifizierer erfordert einen Methodentext, damit der Compiler die Zustandsautomatimplementierung generieren kann. - Ändern Sie den Rückgabetyp eines asynchronen Einstiegspunkts in Task oder Task<TResult> (CS4009). Ab C# 7.1 kann die
Methode sein, aber sie muss zurückgeben oder und sind keine gültigen Einstiegspunktsignaturen. - Entfernen oder Umbenennen eines Einstiegspunkts, wenn das Projekt sowohl eine synchrone als auch eine asynchrone
MainMethode (CS8892) enthält. Der Compiler wählt den synchronen Einstiegspunkt aus und gibt diese Warnung für den asynchronen Kandidaten aus, den er ignoriert. - Fügen Sie dem Lambda-Ausdruck einen expliziten Rückgabetyp hinzu, bevor Sie das
[AsyncMethodBuilder]Attribut anwenden (CS8935). Der Compiler kann den Generatortyp nicht für eine anonyme Methode auflösen, deren Rückgabetyp abgeleitet ist, da das Attribut zur Kompilierungszeit mit einem bestimmten Rückgabetyp abgeglichen werden muss. - Ändern Sie den im
[AsyncMethodBuilder]Attribut angegebenen Typ in einen ungebundenen generischen Typ von Arity eins, wieMyTaskMethodBuilder<>, anstattMyTaskMethodBuilder<T>oder einen nicht generischen Typ (CS8940). Der einschließende Typ des Konstruktors, sofern vorhanden, muss ebenfalls nicht generisch sein. Der Compiler benötigt dieses Shape, damit er den Generator für jeden konkreten Aufgaben-ähnlichen Rückgabetyp erstellen kann. - Ersetzen Sie das manuelle
[MethodImpl(MethodImplOptions.Async)]Attribut durch dasasyncSchlüsselwort in der Methodendeklaration (CS9330). DasMethodImplOptions.AsyncFlag ist für die interne Laufzeitverwendung reserviert und kann nicht direkt im Benutzercode angewendet werden. - Fügen Sie den
asyncModifizierer zu Methoden hinzu, die Iteratorblöcke enthalten, und IAsyncEnumerable<T> oder IAsyncEnumerator<T> zurückgeben (CS8403). Ohne denasyncModifizierer behandelt der Compiler die Methode als synchronen Iterator und kann den asynchronen Streamstatuscomputer nicht generieren. - Entfernen Von Zeigertypparametern aus asynchronen Methoden (CS4005). Zeiger verweisen auf feste Speicherorte, die über asynchrone Aussetzungspunkte nicht sicher beibehalten werden können, wobei die Ausführung möglicherweise in einem anderen Thread fortgesetzt wird.
- Entfernen
__arglistaus asynchronen Methodenparameterlisten (CS4006). Argumentlisten mit variabler Länge hängen von stapelbasierten Aufrufkonventionen ab, die mit dem vom Heap zugewiesenen asynchronen Zustandscomputer nicht kompatibel sind. - Entfernen Sie
ref,inoderoutParameter und Parameter vonref structTypen wie Span<T> oder ReadOnlySpan<T> aus asynchronen Methoden oder asynchronen Lambda-Ausdrücken (CS4012). Diese Parametertypen sind stapelgebunden und können nicht sicher im vom Heap zugewiesenen asynchronen Zustandsautomaten geschlossen werden. - Ändern Sie den Zieldelegattyp so, dass er dem Rückgabetyp der asynchronen Lambda-Funktion (CS4010) entspricht. Eine asynchrone Lambda-Funktion kann
void, Task oder Task<TResult> zurückgeben, und der Compiler kann diese nicht in beliebige Delegattypen konvertieren, die unterschiedliche Rückgabetypen erwarten. - Entfernen Sie den
returnAusdruck aus einer asynchronen Lambda-Funktion, die einem nicht generischenTaskDelegaten zugewiesen ist, oder ändern Sie den Delegatentyp soFunc<Task<T>>, dass die Lambda-Funktion einen Wert (CS8031) zurückgeben kann. Ein nicht generischerTask-Rückgabedelegat stellt einen asynchronen Vorgang ohne Ergebnis dar, sodass das Zurückgeben eines Werts ein Typkonflikt ist. - Entfernen Sie das
[MethodImpl(MethodImplOptions.Synchronized)]Attribut aus asynchronen Methoden (CS4015). DieSynchronizedOption erhält eine Sperre für die gesamte Methodenausführung, aber eine asynchrone Methode wird angehalten und potenziell in verschiedenen Threads fortgesetzt, was die Sperrsemantik undefiniert macht. - Korrigieren Sie den benutzerdefinierten
AsyncMethodBuilderTyp so, dass seineTaskEigenschaft denselben Typ wie der deklarierte Rückgabetyp der asynchronen Methode (CS8204) zurückgibt. Der Compiler verwendet die c0-Eigenschaft des Builders, um das endgültige Aufgabenobjekt abzurufen, sodass ein Typkonflikt verhindert, dass der Zustandsautomat ordnungsgemäß funktioniert.
Asynchrone Praktiken
- CS1989: Async Lambda-Ausdrücke können nicht in Ausdrucksbäume konvertiert werden.
- CS1991: "Type" kann "event" nicht implementieren, da es sich um ein Windows-Runtime-Ereignis handelt und "event" ein reguläres .NET-Ereignis ist.
- CS1997: Da es sich bei der Funktion um eine asynchrone Methode handelt, die einen Wert zurückgibt, darf auf ein Rückgabeschlüsselwort kein Objektausdruck folgen.
-
CS1998: Diese asynchrone Methode enthält keine '
await' Operatoren und wird synchron ausgeführt. Erwägen Sie die Verwendung des Operators "await", um nicht blockierende API-Aufrufe zu erwarten, oder "await Task.Run(...)", um CPU-gebundene Arbeit in einem Hintergrundthread auszuführen. -
CS4014: Da dieser Aufruf nicht erwartet wird, wird die Ausführung der aktuellen Methode fortgesetzt, bevor der Aufruf abgeschlossen ist. Erwägen Sie, den
awaitOperator auf das Ergebnis des Anrufs anzuwenden. - CS8177: Async-Methoden können nicht über lokale Verweise verfügen.
-
CS9123: Der Operator "
&" sollte nicht für Parameter oder lokale Variablen in asynchronen Methoden verwendet werden. - CS4029: Ein Ausdruck vom Typ 'void' kann nicht zurückgegeben werden.
- CS4030: Das Sicherheitsattribute kann nicht auf eine Async-Methode angewendet werden.
- CS4031: Async-Methoden sind in einer Schnittstelle, Klasse oder Struktur mit dem Attribut "SecurityCritical" oder "SecuritySafeCritical" nicht zulässig.
In den folgenden Elementen wird erläutert, wie die einzelnen Fehler korrigiert werden. Weitere Informationen finden Sie unter "Asynchrone Programmierung mit async und await" und dem "await-Operator".
- Fügen Sie den
await-Operator zu jedem Aufruf hinzu, der Task oder Task<TResult> zurückgibt, oder verwerfen Sie das Ergebnis explizit mit_ =, wenn das Fire-and-Forget-Verhalten wirklich beabsichtigt ist (CS4014). Ohneawaitgeht eine vom asynchronen Vorgang ausgelöste Ausnahme unbemerkt verloren, und die aufrufende Methode wird weiter ausgeführt, bevor der Vorgang beendet ist, was zu subtilen Reihenfolgen- und Korrektheitsfehlern führen kann. - Entfernen Sie den
returnAusdruck aus einer asynchronen Methode, deren Rückgabetyp (nicht generisch) istTask, oder ändern Sie den Rückgabetyp soTask<T>, dass die Methode einen Wert (CS1997) zurückgeben muss. Bei einer asynchronen Methode, dieTaskzurückgibt, generiert der Compiler den Taskwrapper. Das Zurückgeben eines Werts stellt einen Typkonflikt dar, da die Methodensignatur kein Ergebnis verspricht. - Fügen Sie mindestens einen
awaitAusdruck zum Methodentext hinzu, oder entfernen Sie denasyncModifizierer, und geben Sie die Aufgabe direkt zurück (CS1998). EineasyncMethode ohneawaitAusdrücke wird vollständig synchron ausgeführt, was unnötigen Zustandsautomataufwand hinzufügt. Wenn die Methode absichtlich eine synchrone Operation umschließt, beseitigen das Entfernen vonasyncund das explizite Zurückgeben des Tasks diesen Overhead. - Schreiben Sie den Lambda-Ausdruck neu, sodass
asyncnicht verwendet wird, wenn er einem Ausdrucksstrukturtyp wieExpression<Func<...>>(CS1989) zugewiesen wird. Ausdrucksbäume stellen Code als Datenstrukturen dar, die der Compiler analysieren oder übersetzen kann, aber der komplexe Zustandsautomat, denasyncerzeugt, kann nicht in einem Ausdrucksbaum erfasst werden. - Ändern Sie die Ereignisimplementierung, sodass sich sowohl die Schnittstellendeklaration als auch die implementierenden Klasse darauf einigen, ob das Ereignis Windows-Runtime-Semantik oder normale .NET-Semantik (CS1991) verwendet. Dieser Fehler gilt für Windows-Runtime-Interoperabilitätsszenarien, in denen ein WinRT-Ereignis nicht als normales .NET-Ereignis implementiert werden kann oder umgekehrt.
- Entfernen Sie die Adresse des Operators (
&) aus Ausdrücken, die auf Parameter oder lokale Variablen in asynchronen Methoden (CS9123) verweisen. Der asynchrone Zustandsautomat kann erfasste Variablen während der Aussetzung in den Heap verschieben, was alle Zeiger, die mit dem Address-of-Operator abgerufen wurden, ungültig machen würde. - Entfernen Sie by-Reference-Variablen aus asynchronen Methoden oder stellen Sie sicher, dass sie keine
await-Grenze (CS8177) überschreiten. Der asynchrone Zustandsautomat erfasst lokale Variablen in heap-zugeordneten Schließungen, und Verweise auf Stapelpositionen können nicht sicher über Anhaltepunkte hinweg beibehalten werden. In C# 13 und höher sind lokale Variablen in asynchronen Methoden zulässig, solange sie keineref-Grenze überschreiten, und dieser Fehler wird nicht erzeugt. - Entfernen Sie die
returnAnweisung, die das Ergebnis einervoid-returning-Methode zurückgibt, oder ändern Sie die aufgerufene Methode, um einen Wert (CS4029) zurückzugeben.return SomeVoidMethod();kann nicht verwendet werden, davoidkein Typ ist, der als Wert zurückgegeben werden kann. Entfernen Sie entweder dasreturnSchlüsselwort, und rufen Sie die Methode als eigenständige Anweisung auf, oder ändern Sie die Signatur der aufgerufenen Methode, um einen konkreten Typ zurückzugeben. - Entfernen Sie Sicherheitsattribute wie
[SecurityCritical]oder[SecuritySafeCritical]aus asynchronen Methoden (CS4030), oder entfernen Sie denasyncModifizierer aus Methoden in Typen, die mit diesen Attributen gekennzeichnet sind (CS4031). Die Codezugriffssicherheitsanmerkungen gelten für die deklarierende Methode, der vom Compiler generierte asynchrone Zustandsautomat wird jedoch in einem separaten Kontext ausgeführt, in dem diese Sicherheitsanmerkungen nicht erzwungen werden können.