CA2016: CancellationToken 매개 변수를 사용하는 메서드로 전달
속성 | 값 |
---|---|
형식 이름 | ForwardCancellationTokenToInvocations |
규칙 ID | CA2016 |
제목 | 인수 하나를 사용하는 메서드에 CancellationToken 매개 변수를 전달하세요. |
범주 | 신뢰성 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 제안 사항 |
원인
이 규칙은 CancellationToken 매개 변수를 수락하지만 전달되지 않은 메서드 호출을 찾고 부모 메서드의 CancellationToken
을 전달하도록 제안합니다.
규칙 설명
이 규칙은 CancellationToken
을 마지막 매개 변수로 사용하는 메서드 정의를 분석한 다음, 해당 본문에서 호출된 모든 메서드를 분석합니다. 메서드 호출이 CancellationToken
을 마지막 매개 변수로 수락하거나 CancellationToken
을 마지막 매개 변수로 사용하는 오버로드를 포함하고 있는 경우 규칙은 수신 대기하는 모든 작업으로 취소 알림이 전파되도록 하는 옵션을 대신 사용하도록 제안합니다.
참고 항목
규칙 CA2016은 CancellationToken
형식을 사용할 수 있는 모든 .NET 버전에서 사용할 수 있습니다. 해당하는 버전은 CancellationToken "적용 대상" 섹션을 참조하세요.
위반 문제를 해결하는 방법
위반을 수동으로 수정하거나 Visual Studio에서 사용할 수 있는 코드 수정을 사용할 수 있습니다. 메서드 호출 옆에 나타나는 전구를 마우스로 가리키고 제안된 변경 사항을 선택합니다.
다음 예제에서는 두 가지 제안된 변경 내용을 보여 줍니다.
취소된 작업 알림을 하위 메서드 호출로 전달하는 데 관심이 없는 경우 이 규칙의 위반을 표시하지 않아도 됩니다. C#의 default
(Visual Basic의 경우 Nothing
) 또는 None을 명시적으로 전달하여 규칙 위반을 표시하지 않을 수도 있습니다.
규칙은 다양한 위반을 탐지할 수 있습니다. 다음 예에서는 규칙이 탐지할 수 있는 사례를 보여 줍니다.
예 1
메서드가 선택적인 토큰 매개 변수를 정의하기 때문에 규칙은 c
매개 변수를 MyMethod
에서 MyMethodWithDefault
호출로 전달하도록 제안합니다.
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault();
}
}
}
Fix:
c
매개 변수를 전달합니다.
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(c);
}
취소 알림을 하위 호출로 전달하는 데 관심이 없는 경우 다음 중 하나를 수행할 수 있습니다.
default
를 명시적으로 전달합니다.
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(default);
}
또는 CancellationToken.None
을 명시적으로 전달합니다.
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(CancellationToken.None);
}
예제 2
메서드에 CancellationToken
매개 변수를 사용하는 오버로드가 있기 때문에 규칙은 c
매개 변수를 MyMethod
에서 MyMethodWithOverload
호출로 전달하도록 제안합니다.
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload()
{
}
public static void MyMethodWithOverload(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload();
}
}
}
Fix:
c
매개 변수를 전달합니다.
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(c);
}
취소 알림을 하위 호출로 전달하는 데 관심이 없는 경우 다음 중 하나를 수행할 수 있습니다.
default
를 명시적으로 전달합니다.
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(default);
}
또는 CancellationToken.None
을 명시적으로 전달합니다.
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(CancellationToken.None);
}
위반이 아닌 예
부모 메서드의 CancellationToken
매개 변수가 마지막 위치에 없습니다.
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken c, int lastParameter)
{
MyMethodWithDefault();
}
}
}
기본 메서드의 CancellationToken
매개 변수가 마지막 위치에 없습니다.
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default, int lastParameter = 0)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault();
}
}
}
오버로드 메서드의 CancellationToken
매개 변수가 마지막 위치에 없습니다.
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(int lastParameter)
{
}
public static void MyMethodWithOverload(CancellationToken ct, int lastParameter)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload();
}
}
}
부모 메서드가 둘 이상의 CancellationToken
매개 변수를 정의합니다.
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken c1, CancellationToken c2)
{
MyMethodWithDefault();
}
}
}
기본값이 있는 메서드가 둘 이상의 CancellationToken
매개 변수를 정의합니다.
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken c1 = default, CancellationToken c2 = default)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault();
}
}
}
메서드 오버로드가 둘 이상의 CancellationToken
매개 변수를 정의합니다.
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(CancellationToken c1, CancellationToken c2)
{
}
public static void MyMethodWithOverload()
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload();
}
}
}
경고 표시 안 함
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
#pragma warning disable CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none
으로 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA2016.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
.NET