tof*_*tim 76 c# asynchronous task-parallel-library cancellation-token
我有一些异步代码,我想添加一个CancellationToken.但是,有许多实现不需要这样做,所以我想有一个默认参数 - 也许是CancellationToken.None.然而,
Task<x> DoStuff(...., CancellationToken ct = null)
Run Code Online (Sandbox Code Playgroud)
产量
类型''的值不能用作默认参数,因为没有标准转换来键入'System.Threading.CancellationToken'
和
Task<x> DoStuff(...., CancellationToken ct = CancellationToken.None)
Run Code Online (Sandbox Code Playgroud)
'ct'的默认参数值必须是编译时常量
有没有办法让CancellationToken有一个默认值?
tof*_*tim 115
事实证明,以下工作:
Task<x> DoStuff(...., CancellationToken ct = default(CancellationToken))
Run Code Online (Sandbox Code Playgroud)
其中,根据文档,被解释一样CancellationToken.None
:
您还可以使用C#
default(CancellationToken)
语句创建空的取消令牌.
Ree*_*sey 22
有没有办法让CancellationToken有一个默认值?
不幸的是,这是不可能的,因为CancellationToken.None
它不是编译时常量,这是可选参数中默认值的要求.
但是,您可以通过重载方法而不是尝试使用默认参数来提供相同的效果:
Task<x> DoStuff(...., CancellationToken ct)
{
//...
}
Task<x> DoStuff(....)
{
return DoStuff(...., CancellationToken.None);
}
Run Code Online (Sandbox Code Playgroud)
sta*_*ica 19
以下是几种解决方案,按照一般优点的降序排列:
default(CancellationToken)
默认值:Task DoAsync(CancellationToken ct = default(CancellationToken)) { … }
Run Code Online (Sandbox Code Playgroud)
在语义上,CancellationToken.None
它将是默认的理想候选者,但不能这样使用,因为它不是编译时常量.default(CancellationToken)
是下一个最好的东西,因为它是一个编译时常量,并且正式记录为等同于CancellationToken.None
.
CancellationToken
参数的方法重载:或者,如果您更喜欢方法重载而不是可选参数(请参阅此主题和此主题的此问题):
Task DoAsync(CancellationToken ct) { … } // actual method always requires a token
Task DoAsync() => DoAsync(CancellationToken.None); // overload producing a default token
Run Code Online (Sandbox Code Playgroud)
对于接口方法,使用扩展方法可以实现相同的方法:
interface IFoo
{
Task DoAsync(CancellationToken ct);
}
static class Foo
{
public static Task DoAsync(this IFoo foo) => foo.DoAsync(CancellationToken.None);
}
Run Code Online (Sandbox Code Playgroud)
这导致更简洁的接口和备用实现者明确地编写转发方法重载.
null
为空并使用默认值:Task DoAsync(…, CancellationToken? ct = null)
{
… ct ?? CancellationToken.None …
}
Run Code Online (Sandbox Code Playgroud)
我最喜欢这个解决方案,因为可空类型带来了较小的运行时开销,并且由于空合并运算符,对取消令牌的引用变得更加冗长??
.
Tod*_*ier 11
另一个选择是使用一个Nullable<CancellationToken>
参数,默认它null
,并在方法内处理它:
Task<x> DoStuff(...., CancellationToken? ct = null) {
var token = ct ?? CancellationToken.None;
...
}
Run Code Online (Sandbox Code Playgroud)
较新版本的 C# 允许为 default(CancellationToken) 版本简化语法。例如:
Task<x> DoStuff(...., CancellationToken ct = default)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22716 次 |
最近记录: |