Я впервые экспериментирую с Котлином и буду рад помочь.
Что делает следующий код, это приостановить выполнение текущей функции без спящего исполняемого потока. Пауза основана на количестве предоставленного времени. Функция работает с использованием поддержки 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.
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 вне неблокирующего сна.