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
'Programing' 카테고리의 다른 글
Excel에서 KB, MB, GB 등으로 셀의 바이트 서식을 어떻게 지정할 수 있습니까? (0) | 2020.10.29 |
---|---|
Facebook 액세스 토큰이 여전히 유효한지 확인하는 방법이 있습니까? (0) | 2020.10.29 |
Bash에서 $ {}와 $ ()의 차이점 (0) | 2020.10.29 |
'dict'개체에 'has_key'속성이 없습니다. (0) | 2020.10.29 |
사용자가 이미 Firebase에 로그인했는지 어떻게 감지하나요? (0) | 2020.10.29 |