다음을 통해 공유


CA2007: 작업을 직접 기다리지 마세요.

속성
규칙 ID CA2007
제목 작업을 직접 대기하지 마세요.
범주 신뢰성
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

비동기 메서드가 Task를 직접 대기합니다.

규칙 설명

비동기 메서드가 Task를 직접 대기하는 경우 비동기 컨텍스트에 따라 작업을 만든 스레드와 같은 스레드에서 일반적으로 연속이 발생합니다. 이 동작으로 인해 성능이 저하될 수 있으며 UI 스레드에서 교착 상태가 발생할 수 있습니다. Task.ConfigureAwait(Boolean)를 호출하여 연속에 대한 의도를 알리는 것이 좋습니다.

위반 문제를 해결하는 방법

위반 문제를 해결하려면 대기된 Task에서 ConfigureAwait를 호출합니다. continueOnCapturedContext 매개 변수에 대해 true 또는 false를 전달할 수 있습니다.

  • 작업에 대해 ConfigureAwait(true)를 호출하는 것은 명시적으로 ConfigureAwait를 호출하지 않는 것과 동작이 같습니다. 이 메서드를 명시적으로 호출하여 원래 동기화 컨텍스트에서 의도적으로 연속을 수행하려는 것임을 판독기에 알립니다.

  • 작업에 대해 ConfigureAwait(false)를 호출하여 스레드 풀에 대한 연속을 예약함으로써 UI 스레드에서의 교착 상태를 방지합니다. 앱과 관계없는 라이브러리의 경우 false를 전달하는 것이 좋은 옵션이 됩니다.

예시

다음 코드 조각은 경고를 생성합니다.

public async Task Execute()
{
    Task task = null;
    await task;
}

위반 문제를 해결하려면 대기된 Task에서 ConfigureAwait를 호출합니다.

public async Task Execute()
{
    Task task = null;
    await task.ConfigureAwait(false);
}

경고를 표시하지 않는 경우

이 경고는 코드가 임의 환경에서 실행될 수 있는 라이브러리, 코드가 환경 또는 메서드의 호출자가 호출되거나 대기되는 방법에 대해 가정할 수 없는 라이브러리를 대상으로 합니다. 일반적으로 라이브러리 코드가 아닌 애플리케이션 코드를 나타내는 프로젝트에 대해서는 이 경고를 완전히 표시하지 않는 것이 좋습니다. 실제로 애플리케이션 코드에서 이 분석기를 실행하면(예: WinForms 또는 WPF 프로젝트의 단추 클릭 이벤트 처리기) 잘못된 작업이 수행될 수 있습니다.

연속을 원래 컨텍스트로 다시 예약하거나 이러한 컨텍스트가 없는 모든 상황에서는 이 경고를 표시하지 않을 수 있습니다. 예를 들어 WinForms 또는 WPF 애플리케이션의 단추 클릭 이벤트 처리기에서 코드를 작성하면 일반적으로 대기의 연속이 UI 스레드에서 실행되어야 하므로 연속을 원래 컨텍스트로 다시 예약하는 기본 동작이 바람직합니다. 또 다른 예로 ASP.NET Core 애플리케이션에서 코드를 작성하면 기본적으로 SynchronizationContext 또는 TaskScheduler가 없습니다. 따라서 ConfigureAwait가 실제로 동작을 변경하지 않습니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

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

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

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

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

분석할 코드 구성

다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.

이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주의 모든 규칙(안정성)에 대해 이러한 모든 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.

비동기 void 메서드 제외

이 규칙에서 값을 반환하지 않는 비동기 메서드를 제외할지를 구성할 수 있습니다. 이러한 종류의 메서드를 제외하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

# Package version 2.9.0 and later
dotnet_code_quality.CA2007.exclude_async_void_methods = true

# Package version 2.6.3 and earlier
dotnet_code_quality.CA2007.skip_async_void_methods = true

출력 종류

이 규칙을 적용할 출력 어셈블리 종류를 구성할 수도 있습니다. 예를 들어 콘솔 애플리케이션이나 동적 연결 라이브러리(UI 앱이 아님)를 생성하는 코드에만 이 규칙을 적용하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary

참고 항목