2017-01-07 7 views
4

Я впервые экспериментирую с Kotlin и буду рад помочь.Unity (C#) -> Kotlin <- Coroutines

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

Unity Пример

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

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

Заранее благодарен!

ответ

6

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

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


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 slack. См. here для получения дополнительной информации о присоединении.

+0

http: // stackoverflow.com/questions/41559105/can-i-take-advantage-of-kotlins-coroutines-by-use-them-in-java-code Ум, взглянув на это? – Wonderlus

2

Вот почти линия за линией перевода вашего C# Unity код на Котлин Сопрограммы с использованием 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()) 
} 

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

Смежные вопросы