Freigeben über


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;
        }
    }
}