다음을 통해 공유


CA2012: ValueTasks를 올바르게 사용

속성
규칙 ID CA2012
제목 ValueTasks를 올바르게 사용하세요.
범주 신뢰성
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 제안 사항
적용 가능한 언어 C# 및 Visual Basic

원인

멤버 호출에서 반환되는 ValueTask 인스턴스가 예외, 손상 또는 성능 저하를 발생시킬 수 있는 방식으로 사용됩니다.

규칙 설명

멤버 호출에서 반환되는 ValueTask 인스턴스는 직접 대기되도록 되어 있습니다. ValueTask를 여러 번 사용하거나 완료가 확인되기 전에 해당 결과에 직접 액세스하면 예외나 손상이 발생할 수 있습니다. 이러한 ValueTask를 무시하면 기능 버그가 발생하거나 성능이 저하될 수 있습니다.

위반 문제를 해결하는 방법

일반적으로 ValueTasks는 지역 변수나 필드와 같은 다른 위치에 저장되거나 삭제되지 않고 직접 대기되어야 합니다.

경고를 표시하지 않는 경우

임의의 멤버 호출에서 반환된 개체의 경우, 호출자는 ValueTask를 단 한 번만 소비해야 한다고 가정해야 합니다(예: 대기). 개발자가 호출되는 멤버를 제어하며 그 구현에 대해 완전한 지식을 가지고 있다면, 예를 들어 반환 ValueTask이 항상 Task 객체를 래핑하는 경우처럼 경고를 억제하는 것이 안전하다는 것을 알 수 있습니다.

Example

public class NumberValueTask
{
    public async ValueTask<int> GetNumberAsync()
    {
        await Task.Delay(100);
        return 123;
    }

    public async Task UseValueTaskIncorrectlyAsync()
    {
        // This code violates the rule,
        // because ValueTask is awaited multiple times
        ValueTask<int> numberValueTask = GetNumberAsync();

        int first = await numberValueTask;
        int second = await numberValueTask; // <- illegal reuse

        // ...
    }

    // This code satisfies the rule.
    public async Task UseValueTaskCorrectlyAsync()
    {
        int first = await GetNumberAsync();
        int second = await GetNumberAsync();

        // ..
    }

    public async Task UseValueTaskAsTaskAsync()
    {
        ValueTask<int> numberValueTask = GetNumberAsync();

        Task<int> numberTask = numberValueTask.AsTask();

        int first = await numberTask;
        int second = await numberTask;

        // ...
    }
}

경고 표시 안 함

단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 후 다시 활성화하십시오.

#pragma warning disable CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않으려면 구성 파일에서 none의 심각도를 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

참고하기