컴파일러 오류 CS1996
lock 문의 본문에서 await를 사용할 수 없습니다.
예
다음 샘플에서는 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;
}
}
}
앞의 코드는 await
가 lock
문 블록에 있으므로 C# 13과 동일한 오류를 생성합니다.
이 오류를 해결하려면
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;
}
}
}
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET