Phi*_*nin 5 .net c# cancellation async-await
我看到微软为异步方法强制执行此模式:
async Task<object> DoMyOperationAsync(int par1, string par2,..., CancellationToken token=default(CancellationToken))
{
...
CancellationToken.ThrowIfRequested();
...
}
Run Code Online (Sandbox Code Playgroud)
每个方法都应该有那个丑陋的CancellationToken token=default(CancellationToken)参数,即使大多数时候它甚至没有被使用,但充其量只是通过了。
为什么我们不能只使用某种 CancellationTokenContext 而不是这个,并在实际需要它的方法中使用它?
public class CancellationTokenContext
{
static AsyncLocal<CancellationToken> asyncContext = new AsyncLocal<CancellationToken>();
public static CancellationToken Current {
get {
return asyncContext.Value;
}
set {
asyncContext.Value = value;
}
}
public static void ThrowIfRequested() {
Current.ThrowIfCancellationRequested();
}
}
public class MyClassWithAsyncMethod{
public async Task<object> DoMyOperationAsync(int par1, string par2,...)
{
...
CancellationTokenContext.ThrowIfRequested();
...
}
}
Run Code Online (Sandbox Code Playgroud)
不使用的主要原因AsyncLocal是它要慢得多。事实上,它是一个字典查找,所以它应该慢大约 20 倍(~20ns vs 1ns)。
另一个因素是:显式通常比隐式更好。尽管我同意这是异步实现中非常烦人的部分。
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |