1

我正在努力理解这份合同select

  1. onSend, onReceive, onReceiveOrNull, 和onLock子句是原子可取消的。当 select 抛出CancellationException时,这意味着这些子句没有执行它们各自的操作。

  2. 作为原子取消的副作用,线程绑定的协程(例如,对于某些 UI 线程)可能会在从同一线程取消后继续执行,如果此选择操作已在原子可取消子句上恢复并且延续被发布到线程的队列中执行。

UI在上下文的示例中,这对我来说是有意义的:

  • 表达式选择一个子句并将其select代码发布到 UI 事件队列
  • 当从队列中挑选代码时,它首先检查的是isActive标志。如果降低,则代码不会运行
  • 这会破坏取消的原子性:您既没有获得CancellationExceptioninselect子句,也没有运行代码(当子句的回调在队列中等待时发生取消)
  • 这就是为什么isActive跳过检查并且代码运行的原因,即使它同时被取消

但是,这不是(1) 中给出的保证。它没有说“您的处理代码运行,或者您CancellationExceptionselect表达式中得到 a”。它只说“如果出现异常,则表示代码没有运行”。这种保证可以在没有 (2) 中给出的行为的情况下实现,因此它不是 (1) 的副作用。

看起来(2)中对行为的描述是正确的,但它提供的保证并不像(1)中描述的那样。它是“如果你没有得到CancellationException,那么处理程序代码将运行”。

文件不应该说明更强的非此即彼的保证吗?

4

0 回答 0