作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 Rx 中的 IScheduler.SchedulePeriodic 方法定期运行一些工作。我希望能够通过允许工作接受 CancellationToken
在处理从 SchedulePeriodic 返回的 IDisposable 时取消,不仅可以在执行之间取消工作,还可以在工作运行时(合作地)取消工作。
在工作取消之前,IDisposable 的处置不应该阻塞,只是为工作在下一次机会取消自身提供机会。
我如何在 .NET 4.0 中使用 Rx 来做到这一点?
它看起来像 cooperative cancellation support added in Rx 2 (请参阅“使调度程序更易于使用 'await'”部分)可能对此有所帮助,但它在 .NET 4 中不可用。
最佳答案
这是我想出的扩展方法:
public static IDisposable SchedulePeriodic(
this IScheduler scheduler,
TimeSpan interval,
Action<CancellationToken> work) {
if (scheduler == null) {
throw new ArgumentNullException("scheduler");
}
if (work == null) {
throw new ArgumentNullException("work");
}
var cancellationDisposable = new CancellationDisposable();
var subscription = scheduler.SchedulePeriodic(
interval,
() => {
try {
work(cancellationDisposable.Token);
} catch (OperationCanceledException e) {
if (e.CancellationToken != cancellationDisposable.Token) {
// Something other than the token we passed in threw this exception
throw;
}
}
});
return new CompositeDisposable(cancellationDisposable, subscription);
}
关于c# - 在 .NET 4 中,如何使用 Rx 的 IScheduler.SchedulePeriodic 方法允许取消正在运行的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25434815/
我想使用 Rx 中的 IScheduler.SchedulePeriodic 方法定期运行一些工作。我希望能够通过允许工作接受 CancellationToken 在处理从 SchedulePerio
我是一名优秀的程序员,十分优秀!