3

在 Kotlin 中有多种启动协程的方法。我发现了几个使用GlobalScopeCoroutineScope使用的例子。但是后者是在启动协程时直接创建的:

  1. 使用GlobalScope

    fun loadConfiguration() {
        GlobalScope.launch(Dispatchers.Main) {
           val config = fetchConfigFromServer() // network request
           updateConfiguration(config)
        }
    }
    
  2. 使用CoroutineScope实例,在启动协程时直接创建:

    fun loadConfiguration() {
        CoroutineScope(Dispatchers.Main).launch {
            val config = fetchConfigFromServer() // network request
            updateConfiguration(config)
        }
    }
    

在这种情况下,这两种方法有区别吗?

第二种情况是不是违反了结构化并发的原则

4

1 回答 1

2

第二种情况是不是违反了结构化并发的原则?

实际上这两种情况同样违反了它,因为它们具有几乎完全相同的语义。GlobalScope.launch您可能遇到的所有反对使用的警告都CoroutineScope().launch同样适用。一个细微的区别是后者完全没有意义,而前者至少有一些合法的用例。

写作CoroutineScope().launch而不是GlobalScope.launch掩盖意图和后果,并且每次都创建一个不必要的对象。

我认为这个CoroutineScope().launch成语的出现仅仅是因为它绕过了你得到的警告GlobalScope.launch

于 2022-01-06T12:41:31.177 回答