【发布时间】:2020-02-27 21:03:40
【问题描述】:
我有一个遗留场景,其中 ref bool 被用于向实现发送取消信号。现在,我想调用一个基于Task 的库方法,该方法采用CancellationToken 实例,我也想在布尔值更改时取消该方法。
这是我必须处理的:
void Method(ref bool isCancelled)
{
while (!isCancelled)
{
...
DoThis();
DoThat();
...
}
}
这就是我想做的:
Task MethodAsync(ref bool isCancelled)
{
while (!isCancelled)
{
...
DoThis();
await DoTheNewThingAsync(isCancelled.ToCancellationToken());
DoThat();
...
}
}
ToCancellationToken() 当然在这个上下文中不存在,只是用来表示意图。
我尝试创建CancellationTokenSource 的自定义实现,但类中没有我可以使用的虚拟对象。也不能直接创建自定义CancellationToken,因为它是struct,不能被继承。
我知道使用ref bool 是一种不好的做法,但我目前无法更改依赖它的底层实现,所以我需要一种方法来使用它的值作为基于任务的取消机制打电话。
【问题讨论】:
-
为布尔值创建扩展方法
public static CancellationToken(this bool isCancelled){//do stuff} -
@DetectivePikachu 你如何建议我在布尔值更改时取消令牌?
-
由于无法在
bool更改值时得到通知,因此无论您想出什么,都需要间歇性地轮询该值以实际触发CancellationToken。这不会是有效的。CancellationTokenSource不仅仅是一个简单的是/否取消标志,所以即使有一些黑魔法巫术方法以某种方式给布尔值取别名,你仍然不能将其用作成熟的实现。 -
你必须使用各种骇人听闻的技巧来完成这项工作,使用后台线程的事件发射器或类似的东西。我认为您最好更新旧版应用程序以在整个过程中使用 CancellationTokens,或者更可能只是坚持他们当前的方案
标签: c# .net async-await task-parallel-library cancellation