令人困惑的“选择”合同

时间:2018-07-03 15:44:07

标签: kotlin kotlinx.coroutines

我正在努力理解select的合同:

  1.   

    onSendonReceiveonReceiveOrNullonLock子句是原子可取消的。当select抛出CancellationException时,表示这些子句没有执行各自的操作。

  2.   

    作为原子取消的副作用,即使已经从同一线程上取消了该选择操作,线程绑定协程(例如,对于某些UI线程)也可能继续执行,即使从同一线程取消了该协程原子上可以取消的子句,并且将继续发布到线程队列中以供执行。

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

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

但是,这不是(1)中给出的保证。它不会说“要么运行您的处理代码,要么您在CancellationException表达式中得到一个select”。它只说“如果您有异常,则意味着代码未运行”。没有(2)中给出的行为就可以实现这种保证,所以这不是(1)中的副作用。

似乎(2)中的行为描述是正确的,但它提供的保证与(1)中所述不同。这是“如果没有得到CancellationException,则处理程序代码将运行”。

文档中是否应该声明更强的-或保证?

0 个答案:

没有答案