Unity (C #) -> Kotlin <- Coroutines

Я впервые экспериментирую с Котлином и буду рад помочь.

Что делает следующий код, это приостановить выполнение текущей функции без спящего исполняемого потока. Пауза основана на количестве предоставленного времени. Функция работает с использованием поддержки Coroutine на языке C #. (Эта поддержка была недавно добавлена ​​в Котлин!)

Пример единства

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); } 

Я не смог понять, как сделать что-то подобное в Котлине. Может ли кто-нибудь помочь мне в правильном направлении? Если я выясню это до того, как будет отправлен ответ, я обновлю свой пост.

Заранее спасибо!

Имейте в виду, что сопрограммы являются частью Kotlin 1.1, который все еще находится в EAP (предварительный предварительный просмотр доступа). Хотя я лично испытал большой успех, API еще не стабилен, и вы не должны полагаться на то, что он работает на производстве. Кроме того, этот ответ, скорее всего, устареет к моменту завершения проекта Kotlin 1.1.

  1. Если вы еще этого не сделали, обновите свой проект и свою IDE до последней вехи Kotlin 1.1 EAP (M04 на момент написания этой статьи), следуя инструкциям внизу этого сообщения в блоге .
  2. Найдите или напишите функцию, которая будет делать то, что вы хотите.
    • kotlinx.coroutines имеет немало, хотя и не тот, который вы ищете в этом случае.
    • К счастью, довольно легко написать неблокирующий сон:

 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) } 

Есть некоторые важные замечания, о которых нужно знать. По сравнению с .NET, где все неприемлемые методы будут обрабатываться каким-то общим центральным пулом где-нибудь (я даже не уверен, где, если честно), примерный метод сна, связанный / показанный выше, запустит всю продолжающуюся работу в пуле исполнителей, вы указываете. В приведенном выше примере метода sleep используется один поток, что означает, что вся работа, которая возникает после sleep будет обрабатываться одним потоком. Этого может быть недостаточно для вашего случая использования.

Если у вас есть дополнительные вопросы о деталях сопрограмм Котлина, я настоятельно рекомендую присоединяться к каналу #coroutines в слайде kotlinlang. Подробнее см. Здесь .

Вот почти по очереди перевод кода C # Unity на Kotlin coroutines с kotlix.coroutines библиотеки 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()) } 

Вы можете узнать больше в руководстве по kotlinx.coroutines на примере, который имеет больше примеров, подобных этому, показывая различные доступные функции Kotlin coroutines вне неблокирующего сна.