人为的例子,但假设我在异步方法中有以下内容:
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);
}
在这种情况下,不会调用Callback ,可能是因为来自 的异常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();
}