編譯器錯誤 CS1996
無法在 lock 陳述式的主體中等候
範例
下列範例會產生 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;
}
}
}
上述程式碼會產生與 C# 13 相同的錯誤,如同 await
在 lock
陳述式區塊中。
更正這個錯誤
lock
陳述式區塊內的非同步程式碼很難可靠地實作,而且更難以一般方式實作。 C# 編譯器不支援這麼做以避免發出容易造成死結的程式碼。 從 lock
陳述式區塊擷取非同步程式碼,會更正此錯誤。 例如:
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;
}
}
}