Delen via


Compilerfout CS1996

Kan niet wachten in de hoofdtekst van een vergrendelingsinstructie

Opmerking

In het volgende voorbeeld wordt CS1996 gegenereerd:

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

De voorgaande code produceert dezelfde fout met C# 13, zoals het await in het lock instructieblok staat.

Deze fout corrigeren

Asynchrone code binnen een lock instructieblok is moeilijk om betrouwbaar en zelfs moeilijker te implementeren in algemene zin. De C#-compiler biedt geen ondersteuning om te voorkomen dat code gevoelig is voor impasses. Als u de asynchrone code uit het lock instructieblok extraheert, wordt deze fout gecorrigeerd. Voorbeeld:

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