我正在努力理解这份合同select
:
onSend
,onReceive
,onReceiveOrNull
, 和onLock
子句是原子可取消的。当 select 抛出CancellationException
时,这意味着这些子句没有执行它们各自的操作。作为原子取消的副作用,线程绑定的协程(例如,对于某些 UI 线程)可能会在从同一线程取消后继续执行,如果此选择操作已在原子可取消子句上恢复并且延续被发布到线程的队列中执行。
UI
在上下文的示例中,这对我来说是有意义的:
- 表达式选择一个子句并将其
select
代码发布到 UI 事件队列 - 当从队列中挑选代码时,它首先检查的是
isActive
标志。如果降低,则代码不会运行 - 这会破坏取消的原子性:您既没有获得
CancellationException
inselect
子句,也没有运行代码(当子句的回调在队列中等待时发生取消) - 这就是为什么
isActive
跳过检查并且代码运行的原因,即使它同时被取消
但是,这不是(1) 中给出的保证。它没有说“您的处理代码运行,或者您CancellationException
在select
表达式中得到 a”。它只说“如果出现异常,则表示代码没有运行”。这种保证可以在没有 (2) 中给出的行为的情况下实现,因此它不是 (1) 的副作用。
看起来(2)中对行为的描述是正确的,但它提供的保证并不像(1)中描述的那样。它是“如果你没有得到CancellationException
,那么处理程序代码将运行”。
文件不应该说明更强的非此即彼的保证吗?