Tag: 取消令牌

CancellationToken的默认参数

我有一些asynchronous代码,我想添加CancellationToken。 然而,有很多不需要的实现,所以我想有一个默认参数 – 也许是CancellationToken.None。 然而, Task<x> DoStuff(…., CancellationToken ct = null) 产量 types''的值不能用作默认参数,因为没有标准转换来键入'System.Threading.CancellationToken' 和 Task<x> DoStuff(…., CancellationToken ct = CancellationToken.None) “ct”的默认参数值必须是编译时常量 有没有什么办法来取消CancellationToken的默认值?

如何使方法取消而不会变得丑陋?

我目前正在改造我们长期以来可以取消的方法。 我正在计划使用System.Threading.Tasks.CancellationToken来实现。 我们的方法通常执行几个长时间运行的步骤(主要发送命令然后等待硬件),例如 void Run() { Step1(); Step2(); Step3(); } 我的第一个(也许是愚蠢的)取消想法将转化为 bool Run(CancellationToken cancellationToken) { Step1(cancellationToken); if (cancellationToken.IsCancellationRequested) return false; Step2(cancellationToken); if (cancellationToken.IsCancellationRequested) return false; Step3(cancellationToken); if (cancellationToken.IsCancellationRequested) return false; return true; } 坦率地看起来很可怕。 这个“模式”也将在单个步骤内部继续(而且它们必然已经相当长)。 这将使Thread.Abort()看起来相当性感,虽然我知道它不推荐。 有没有一个更清晰的模式来实现这一点,不隐藏在许多样板代码下面的应用程序逻辑? 编辑 作为步骤性质的一个例子, Run方法可以读取 void Run() { GiantRobotor.MoveToBase(); Oven.ThrowBaguetteTowardsBase(); GiantRobotor.CatchBaguette(); // … } 我们正在控制不同的硬件单元,需要同步才能一起工作。

为什么CancellationToken与CancellationTokenSource分开?

我正在寻找为什么除CancellationTokenSource类之外还引入了.NET CancellationToken结构的基本原理。 我理解如何使用API​​,但也想明白为什么要这样devise。 也就是说,为什么我们有: var cts = new CancellationTokenSource(); SomeCancellableOperation(cts.Token); … public void SomeCancellableOperation(CancellationToken token) { … token.ThrowIfCancellationRequested(); … } 而不是直接传递CancellationTokenSource,如: var cts = new CancellationTokenSource(); SomeCancellableOperation(cts); … public void SomeCancellableOperation(CancellationTokenSource cts) { … cts.ThrowIfCancellationRequested(); … } 这是一个性能优化的基础上,取消状态检查发生比传递令牌更频繁的事实? 因此,CancellationTokenSource可以跟踪和更新CancellationToken,并且对于每个令牌,取消检查是本地字段访问? 在这两种情况下,如果一个不locking的volatile BOOL就足够了,我还是不明白为什么会更快。 谢谢!

asynchronousnetworking操作从未完成

我有几个asynchronousnetworking操作返回一个可能永远不会完成的任务: UdpClient.ReceiveAsync不接受CancellationToken TcpClient.GetStream返回一个不尊重Stream.ReadAsync上的CancellationToken的NetworkStream (仅在操作开始时检查取消) 两者都等待可能永远不会到来的消息(因为丢包或没有响应)。 这意味着我有从未完成的幻影任务,永远不会运行的延续,并使用套接字保持。 我知道我可以使用TimeoutAfter ,但这只会解决延续问题。 那我该怎么办?

Task构造函数中的取消标记:为什么?

某些System.Threading.Tasks.Task构造函数将CancellationToken作为参数: CancellationTokenSource source = new CancellationTokenSource(); Task t = new Task (/* method */, source.Token); 让我感到困惑的是,从方法体内部无法实际获取传入的令牌(例如,没有像Task.CurrentTask.CancellationToken )。 令牌必须通过一些其他机制来提供,比如状态对象或者在lambda中捕获。 那么在构造函数中提供取消标记的目的是什么?