CA2007: 작업을 직접 기다리지 마세요.
속성 | 값 |
---|---|
규칙 ID | CA2007 |
제목 | 작업을 직접 대기하지 마세요. |
범주 | 신뢰성 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
규칙 설명
비동기 메서드가 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
참고 항목
.NET