Programing

CancellationToken의 기본 매개 변수

crosscheck 2020. 10. 29. 07:50
반응형

CancellationToken의 기본 매개 변수


CancellationToken을 추가하고 싶은 비동기 코드가 있습니다. 그러나 이것이 필요하지 않은 많은 구현이 있으므로 기본 매개 변수 인 CancellationToken.None을 사용하고 싶습니다. 하나,

Task<x> DoStuff(...., CancellationToken ct = null)

수확량

'System.Threading.CancellationToken'유형에 대한 표준 변환이 없기 때문에 ''유형의 값을 기본 매개 변수로 사용할 수 없습니다.

Task<x> DoStuff(...., CancellationToken ct = CancellationToken.None)

'ct'의 기본 매개 변수 값은 컴파일 타임 상수 여야합니다.

CancellationToken에 대한 기본값을 가질 수있는 방법이 있습니까?


다음이 작동하는 것으로 밝혀졌습니다.

Task<x> DoStuff(...., CancellationToken ct = default(CancellationToken))

이는 문서에 따르면 , 동일로 해석됩니다 CancellationToken.None:

C # default(CancellationToken)문을 사용하여 빈 취소 토큰을 만들 수도 있습니다 .


CancellationToken에 대한 기본값을 가질 수있는 방법이 있습니까?

불행히도 이것은 CancellationToken.None컴파일 시간 상수가 아니기 때문에 가능 하지 않습니다. 이는 선택적 인수의 기본값에 대한 요구 사항입니다.

그러나 기본 매개 변수를 사용하는 대신 오버로드 된 메소드를 만들어 동일한 효과를 제공 할 수 있습니다.

Task<x> DoStuff(...., CancellationToken ct)
{
    //...
}

Task<x> DoStuff(....)
{
    return DoStuff(...., CancellationToken.None);
}

다음은 일반적인 장점의 내림차순으로 몇 가지 솔루션입니다.

1. default(CancellationToken)기본값으로 사용 :

Task DoAsync(CancellationToken ct = default(CancellationToken)) { … }

의미 상으로는 CancellationToken.None기본값에 대한 이상적인 후보이지만 컴파일 시간 상수가 아니기 때문에 사용할 수 없습니다. default(CancellationToken)컴파일 시간 상수이고 공식적으로CancellationToken.None .

2. CancellationToken매개 변수 없이 메소드 오버로드 제공 :

당신이 선택적 매개 변수를 통해 메서드 오버로드를 선호하는 경우 또는 (볼 그 주제에 대한 질문에) :

Task DoAsync(CancellationToken ct) { … } // actual method always requires a token
Task DoAsync() => DoAsync(CancellationToken.None); // overload producing a default token

인터페이스 메서드의 경우 확장 메서드를 사용하여 동일한 결과를 얻을 수 있습니다.

interface IFoo
{
    Task DoAsync(CancellationToken ct);
}

static class Foo
{
    public static Task DoAsync(this IFoo foo) => foo.DoAsync(CancellationToken.None);
}

그 결과 인터페이스가 더 얇아지고 구현자가 전달 메서드 오버로드를 명시 적으로 작성하지 않아도됩니다.

3. 매개 변수를 nullable로 만들고 null기본값으로 사용 :

Task DoAsync(…, CancellationToken? ct = null)
{
    … ct ?? CancellationToken.None …
}

nullable 형식에는 런타임 오버 헤드가 적고 null 병합 연산자 때문에 취소 토큰에 대한 참조가 더 장황 해지기 때문에이 솔루션이 가장 마음에 듭니다 ??.


또 다른 옵션은 Nullable<CancellationToken>매개 변수 를 사용하고 기본값을로 설정 한 null다음 메서드 내에서 처리하는 것입니다.

Task<x> DoStuff(...., CancellationToken? ct = null) {
    var token = ct ?? CancellationToken.None;
    ...
}

Tofutim's answer is one way, but from the comments I see that people have issues with it.

In that case, I did suggest that one can have a method as follows:

Task<x> DoStuff(...., CancellationToken ct)
{
} 

and overload it as:

Task<x> DoStuff(....)
{
    return DoStuff(...., CancellationToken.None);
}

This compiles, because the value of CancellationToken.None is not required at compile time.

참고URL : https://stackoverflow.com/questions/22359706/default-parameter-for-cancellationtoken

반응형