我正在努力理解select
的合同:
onSend
,onReceive
,onReceiveOrNull
和onLock
子句是原子可取消的。当select抛出CancellationException
时,表示这些子句没有执行各自的操作。
作为原子取消的副作用,即使已经从同一线程上取消了该选择操作,线程绑定协程(例如,对于某些UI线程)也可能继续执行,即使从同一线程取消了该协程原子上可以取消的子句,并且将继续发布到线程队列中以供执行。
在UI
上下文示例中,这对我来说很有意义:
select
表达式选择一个子句并将其代码发布到UI事件队列中isActive
标志。如果降低,则代码不会运行CancellationException
子句中获得select
,也没有代码运行(在子句的回调在队列中等待时取消发生)isActive
检查被跳过并且即使这段时间代码被取消也可以运行代码的原因但是,这不是(1)中给出的保证。它不会说“要么运行您的处理代码,要么您在CancellationException
表达式中得到一个select
”。它只说“如果您有异常,则意味着代码未运行”。没有(2)中给出的行为就可以实现这种保证,所以这不是(1)中的副作用。
似乎(2)中的行为描述是正确的,但它提供的保证与(1)中所述不同。这是“如果没有得到CancellationException
,则处理程序代码将运行”。
文档中是否应该声明更强的-或保证?