Unidad (C #) -> Kotlin <- Corutinas

Estoy experimentando con Kotlin por primera vez y me gustaría algo de ayuda.

Lo que hace el código a continuación es pausar la ejecución de la function actual sin dormir el hilo de ejecución. La pausa se basa en la cantidad de time proporcionado. La function funciona al usar el soporte de Coroutine en el lenguaje C #. (¡Este soporte también fue agregado recientemente a Kotlin!)

Ejemplo de unidad

void Start() { print("Starting " + Time.time); StartCoroutine(WaitAndPrint(2.0F)); print("Before WaitAndPrint Finishes " + Time.time); } IEnumerator WaitAndPrint(float waitTime) { yield return new WaitForSeconds(waitTime); print("WaitAndPrint " + Time.time); } 

No he podido averiguar cómo hacer algo similar en Kotlin. ¿Alguien puede ayudarme a guiarme en la dirección correcta? Si lo resuelvo antes de publicar una respuesta, actualizaré mi publicación.

¡Gracias por adelantado!

Tenga en count que las corutinas son parte de Kotlin 1.1, que todavía está en EAP (vista previa de acceso temprano). Si bien personalmente he tenido un gran éxito, la API aún no es estable y no debe confiar en que funcione en producción. Además, es probable que esta respuesta quede obsoleta cuando finalice Kotlin 1.1.

  1. Si aún no lo hizo, actualice su proyecto y su IDE al último hito de EAP de Kotlin 1.1 (M04 en el momento de escribir esto) siguiendo las instrucciones que se encuentran en la parte inferior de esta publicación de blog .
  2. Encuentra o escribe una function que hará lo que quieras.
    • kotlinx.coroutines tiene bastantes, aunque no es el que está buscando en este caso.
    • Afortunadamente, resulta bastante fácil escribir un sueño sin locking:

 private val executor = Executors.newSingleThreadScheduledExecutor { Thread(it, "sleep-thread").apply { isDaemon = true } } suspend fun sleep(millis: Long): Unit = suspendCoroutine { c -> executor.schedule({ c.resume(Unit) }, millis, TimeUnit.MILLISECONDS) } 

Hay algunas advertencias importantes para tener en count. Comparado con .NET donde todos los methods suspendibles serán trabajados por algún grupo central compartido en alguna parte (ni siquiera estoy seguro de dónde, para ser honesto), el método de suspensión de ejemplo vinculado / mostrado arriba ejecutará todo el trabajo continuo en el grupo de ejecutores que tu específicas. El método de sleep ejemplo vinculado anteriormente utiliza un único hilo, lo que significa que todo trabajo que se produce después del sleep será manejado por un único hilo. Eso puede no ser suficiente para su caso de uso.

Si tiene preguntas adicionales sobre los detalles de las corotinas de Kotlin, le recomiendo que se una al canal #coroutines en kotlinlang slack. Mira aquí para más detalles sobre cómo unirte.

Aquí hay una traducción casi línea por línea de su código de unidad de C # para corotines de Kotlin utilizando la biblioteca de kotlix.coroutines :

 fun main(args: Array<String>) { println("Starting " + Instant.now()) launch(CommonPool) { waitAndPrint(2.0f) } println("Before waitAndPrint Finishes " + Instant.now()) // Kotlin coroutines are like daemon threads, so we have to keep the main thread around Thread.sleep(3000) } suspend fun waitAndPrint(waitTime: Float) { delay((waitTime * 1000).toLong()) // convert it to integer number of milliseconds println("waitAndPrint " + Instant.now()) } 

Puede get más información en la Guía de kotlinx.coroutines por ejemplo, que tiene más ejemplos como este, que muestra varias características disponibles de corotines de Kotlin más allá de la suspensión sin locking.