从暂停功能启动协程

时间:2019-03-11 13:47:45

标签: kotlin kotlin-coroutines

鉴于我们有一个暂停功能,但this不是CoroutineScope,我们如何启动其他协程,使它们与运行此suspending函数的当前范围相关联?

3 个答案:

答案 0 :(得分:3)

每个可挂起的函数都可以访问全局变量coroutineContext,您可以将其包装在CoroutineScope中,但这不是其预期目的。它在那里,因此您可以随时检查协程是否已取消,到达调试信息(如作业名称等)。

用罗曼·伊里扎洛夫(Roman Elizarov)在最近的Medium post中说:

suspend fun doNotDoThis() {
    CoroutineScope(coroutineContext).launch {
        println("I'm confused")
    }
}
     

请勿执行此操作!

可挂起的函数不应触发可能在返回后继续进行的并发工作。它应该仅使用并发来实现任务的并行分解,这意味着它将等待所有子协程完成。

您应该决定使用CoroutineScope的接收方的普通函数(表示启动并发工作的意图) 或使用等待所有函数完成的可挂起函数它开始的工作。

因此,如果要并行分解,请使用coroutineScope或可能的supervisorScope块:

coroutineScope {
    launch { 
        // ... task to run in the background
    }
    // ... more work while the launched task runs in parallel
}
// All work done by the time we reach this line

coroutineScope是一个可挂起的函数,要等到它启动的所有协程都完成后才能完成。

答案 1 :(得分:0)

您可以在CoroutineScope上创建扩展功能,或者将CoroutineScope作为参数来使用扩展功能:

fun CoroutineScope.doThis() {
    launch { ... }
}

fun doThatIn(scope: CoroutineScope) {
    scope.launch { ... }
}

您也可以根据需要使用coroutineScopesupervisorScope

suspend fun someFun() = coroutineScope {
    launch { ... }
}

suspend fun someFun() = supervisorScope {
    launch { ... }
}

答案 2 :(得分:0)

您可以只使用<df:EntityProperty name="prdate" index="3" displayName="Date *" hintText="Enter Date *"> <df:EntityProperty.editor> <df:PropertyEditor type="DatePicker"> <df:PropertyEditor.propertyEditorStyle> <df:PropertyEditorStyle labelHidden="true" labelWidth="0" ios:labelFontName="Times New Roman" android:labelFontName="sans-serif-light"/> </df:PropertyEditor.propertyEditorStyle> </df:PropertyEditor> </df:EntityProperty.editor> <df:EntityProperty.validators> <df:NonEmptyValidator errorMessage="Please enter a date"/> </df:EntityProperty.validators> </df:EntityProperty> withContext()来启动另一个协程:

coroutineScope()

虽然第二个将覆盖上下文的withContext(coroutineContext) { launch { ... } } ,但重用上下文:

Job