作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
人为的例子,但假设我在异步方法中有以下内容:
var cts = new CancellationTokenSource();
cts.CancelAfter(2000);
cts.Token.Register(Callback);
SomethingThatMightThrow();
await Task.Delay(10000, cts.Token);
只要几秒钟后回调被调用,这就会按预期工作。但是,我想在 Task.Delay
之后处理注册,所以假设我做了以下修改:
var cts = new CancellationTokenSource();
cts.CancelAfter(2000);
using (cts.Token.Register(Callback))
{
SomethingThatMightThrow();
await Task.Delay(10000, cts.Token);
}
在这种情况下,回调未被调用,大概是因为来自await Task.Delay...
的异常导致注册在它被调用之前被处理掉。
确保在取消时调用 Callback
并始终处理注册的最佳方法是什么?
我确实想到了以下内容,但我不确定它有多健壮:
var cts = new CancellationTokenSource();
cts.CancelAfter(2000);
var ctr = cts.Token.Register(Callback);
try
{
SomethingThatMightThrow();
await Task.Delay(10000, cts.Token);
}
finally
{
if (!cts.Token.IsCancellationRequested)
ctr.Dispose();
}
最佳答案
CancellationToken.Register
通常用于将新的 CancellationToken
系统与使用其他类型的取消通知的旧系统互操作。它不适用于通用的“取消回调”。
如果您想在操作取消时以某种方式做出响应,那么您只需捕获适当的异常:
using (var cts = new CancellationTokenSource())
{
cts.CancelAfter(2000);
SomethingThatMightThrow();
try
{
await Task.Delay(10000, cts.Token);
}
catch (OperationCanceledException)
{
Callback();
}
}
关于c# - 处理 CancellationTokenRegistration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567124/
人为的例子,但假设我在异步方法中有以下内容: var cts = new CancellationTokenSource(); cts.CancelAfter(2000); cts.Token.Reg
CancellationTokenSource 的 Dispose() 是否也会处理通过 Token.Register() 获取的任何子 CancellationTokenRegistration 对
我一直看到在 CancellationTokenRegistration 结果上使用 Cancellation.Register 和 using 子句的代码: using (CancellationT
我是一名优秀的程序员,十分优秀!