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;
}
}
}
Spolupracujte s námi na GitHubu
Zdroj tohoto obsahu najdete na GitHubu, kde můžete také vytvářet a kontrolovat problémy a žádosti o přijetí změn. Další informace najdete v našem průvodci pro přispěvatele.