Udostępnij za pośrednictwem


Błąd kompilatora CS1996

Nie można oczekiwać w treści instrukcji lock

Przykład

Poniższy przykład generuje cs1996:

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

Powyższy kod generuje ten sam błąd w języku C# 13, co await znajduje się w bloku instrukcji lock .

Aby poprawić ten błąd

Kod asynchroniczny w lock bloku instrukcji jest trudny do zaimplementowania niezawodnie, a nawet trudniej zaimplementować w ogólnym sensie. Kompilator języka C# nie obsługuje tego, aby uniknąć emitowania kodu podatnego na zakleszczenia. Wyodrębnianie kodu asynchronicznego z lock bloku instrukcji poprawia ten błąd. Na przykład:

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