Sdílet prostřednictvím


Chyba kompilátoru CS1996

V textu příkazu lock nelze čekat.

Příklad

Následující ukázka 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;
        }
    }
}

Předchozí kód vytvoří stejnou chybu s jazykem C# 13, protože await je v lock bloku příkazu.

Oprava této chyby

Asynchronní kód v rámci lock bloku příkazů je obtížné spolehlivě a ještě obtížnější implementovat v obecném smyslu. Kompilátor jazyka C# to nepodporuje, aby se zabránilo generování kódu náchylného k zablokování. Extrahování asynchronního kódu z lock bloku příkazu opraví tuto chybu. Příklad:

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