鉴于我们有一个暂停功能,但this
不是CoroutineScope
,我们如何启动其他协程,使它们与运行此suspending
函数的当前范围相关联?
答案 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 { ... }
}
您也可以根据需要使用coroutineScope
或supervisorScope
:
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