다음을 통해 공유


컴파일러 오류 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;
        }
    }
}

앞의 코드는 awaitlock 문 블록에 있으므로 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;
        }
    }
}