仅使用首先返回的结果运行多个挂起函数

问题描述

我可以通过三种不同的方式在网络上查找新配置的设备,我希望所有这三种设备同时运行,但是一旦找到它们就立即停止所有运行。我不确定如何使用协同程序来完成此操作。这是我仅使用其中之一的方法:

scanningJob = lifecycleScope.launchWhenCreated {
    val provisioningPing = ProvisioningPing(broadcastIP)
    val provisionedDevice = provisioningPing.scan()
    provisionedDevice?.let { provisioningDeviceFound(it) }
}

我想要类似以下的内容,但我不知道如何在Kotlin中实现它,也许以某种方式await来实现?

scanningJob = lifecycleScope.launchWhenCreated {
    val provisioningPing = ProvisioningPing(broadcastIP)
    val provisioningUdp = ProvisioningUDP()
    val provisioningMdns = ProvisioningMdns(context)

    // How do I make these three lines run at the same time
    // and then call provisioningDeviceFound(...) with whichever
    // one returns first?
    val provisionedDevicePing = provisioningPing.scan()
    val provisionedDeviceUdp = provisioningUdp.scan()
    val provisionedDeviceMdns = provisioningMdns.scan()

}

所有三种方法的scan函数签名都是相同的:

suspend fun scan(): ProvisionedDevice? {
    /* Cool scanning code here */
}

provisioningDeviceFound(device: ProvisionedDevice)函数中,它将调用scanningJob.cancel()杀死所有三个挂起的函数,至少我认为这是阻止它们的方法?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...