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;
}
}
}
Współpracuj z nami w serwisie GitHub
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.