2017-01-07 10 views
4

私は初めてKotlinを実験しています。Unity(C#) - > Kotlin < - Coroutines

以下のコードは、実行中のスレッドをスリープさせずに、現在の関数の実行を一時停止します。一時停止は、提供された時間に基づいて行われます。この関数は、C#言語のCoroutineサポートを使用して動作します。 (このサポートはまた、最近Kotlinに追加されました!)

ユニティ例

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に似た何かをする方法を見つけ出すことができませんでした。誰かが正しい方向に私を導くのを助けることができますか?回答が投稿される前に私がそれを見つけたら、私は自分の投稿を更新します。

ありがとうございます!

答えて

6

コルーチンはまだEAP(早期アクセスプレビュー)にあるKotlin 1.1の一部です。個人的には大きな成功を収めていますが、APIはまだ安定しておらず、本番環境で動作することに頼るべきではありません。また、この回答は、Kotlin 1.1が完成した時点で時代遅れになる可能性があります。あなたがまだの場合は

  1. は、this blog postの下部にある手順に従って、最新のKotlin 1.1 EAPのマイルストーン(この記事の執筆時点でM04)にプロジェクトとあなたのIDEをアップグレードしてください。
  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と比較すると(私は正直なところではどこにいてもわからない)、リンクされた/表示されたスリープメソッドの例は、executorプールあなたが指定します。上にリンクされているsleepメソッドの例は、単一のスレッドを使用しています。つまり、sleep以降に発生するすべての作業は、1つのスレッドで処理されます。あなたのユースケースではそれでは不十分かもしれません。

コトリンのコルーチンの詳細についてご質問がある場合は、kotlinlangスラックの#coroutinesチャンネルに参加することを強くお勧めします。参加の詳細については、hereを参照してください。ここで

+0

http:// stackoverflow。com/questions/41559105/java-i-take-kotlins-of-kotlins-coroutines-by-in-javaコードで これを見ていらっしゃいますか? – Wonderlus

2

は、ほぼライン・バイ・ラインkotlix.coroutinesライブラリを使用してKotlinのコルーチンにあなたのC#のユニティコードの翻訳です:

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で多くを学ぶことができますノンブロッキング睡眠を超えたコトリンコルーチンの方法

関連する問題