Compilerfehler CS1996
Kann nicht im Text einer lock-Anweisung warten.
Beispiel
Im folgenden Beispiel wird der Fehler CS1996 generiert:
public class C
{
private readonly Dictionary<string, string> keyValuePairs = new();
public async Task<string> ReplaceValueAsync(string key, HttpClient httpClient)
{
lock (keyValuePairs)
{
var newValue = await httpClient.GetStringAsync(string.Empty);
if (keyValuePairs.ContainsKey(key)) keyValuePairs[key] = newValue;
else keyValuePairs.Add(key, newValue);
return newValue;
}
}
}
Der vorangehende Code erzeugt den gleichen Fehler bei C# 13, da sich await
im lock
-Anweisungsblock befindet.
So beheben Sie diesen Fehler
Die zuverlässige Implementierung von asynchronem Code in einem lock
-Anweisungsblock ist schwierig, und eine allgemeine Implementierung ist sogar noch schwieriger. Der C#-Compiler unterstützt dies nicht, um die Ausgabe von Code zu vermeiden, der für Deadlocks anfällig ist. Dieser Fehler kann durch Extrahieren des asynchronen Codes aus dem lock
-Anweisungsblock behoben werden. Zum Beispiel:
public class C
{
private readonly Dictionary<string, string> keyValuePairs = new();
public async Task<string> ReplaceValueAsync(string key, HttpClient httpClient)
{
var newValue = await httpClient.GetStringAsync(string.Empty);
lock (keyValuePairs)
{
if (keyValuePairs.ContainsKey(key)) keyValuePairs[key] = newValue;
else keyValuePairs.Add(key, newValue);
return newValue;
}
}
}