Share via


CA2016: CancellationToken 매개 변수를 사용하는 메서드로 전달

속성
형식 이름 ForwardCancellationTokenToInvocations
규칙 ID CA2016
타이틀 인수 하나를 사용하는 메서드에 CancellationToken 매개 변수를 전달하세요.
범주 신뢰성
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

이 규칙은 CancellationToken 매개 변수를 수락하지만 전달되지 않은 메서드 호출을 찾고 부모 메서드의 CancellationToken을 전달하도록 제안합니다.

규칙 설명

이 규칙은 CancellationToken을 마지막 매개 변수로 사용하는 메서드 정의를 분석한 다음, 해당 본문에서 호출된 모든 메서드를 분석합니다. 메서드 호출이 CancellationToken을 마지막 매개 변수로 수락하거나 CancellationToken을 마지막 매개 변수로 사용하는 오버로드를 포함하고 있는 경우 규칙은 수신 대기하는 모든 작업으로 취소 알림이 전파되도록 하는 옵션을 대신 사용하도록 제안합니다.

참고 항목

규칙 CA2016은 CancellationToken 형식을 사용할 수 있는 모든 .NET 버전에서 사용할 수 있습니다. 해당하는 버전은 CancellationToken "적용 대상" 섹션을 참조하세요.

위반 문제를 해결하는 방법

위반을 수동으로 수정하거나 Visual Studio에서 사용할 수 있는 코드 수정을 사용할 수 있습니다. 메서드 호출 옆에 나타나는 전구를 마우스로 가리키고 제안된 변경 사항을 선택합니다.

다음 예제에서는 두 가지 제안된 변경 내용을 보여 줍니다.

Rule CA2016 - Forward the CancellationToken parameter to methods that take one

취소된 작업 알림을 하위 메서드 호출로 전달하는 데 관심이 없는 경우 이 규칙의 위반을 표시하지 않아도 됩니다. 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

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