#kotlin #async-await #kotlin-coroutines
#kotlin #async-await #kotlin-сопрограммы
Вопрос:
В C # 8 теперь есть IAsyncEnumerable. Есть ли эквивалент Kotlin для этого? Например, в C # await foreach(...)
теперь вы можете (с IAsyncEnumerable
):
async Task Main()
{
await foreach(var dt in new Seconds().Take(10))
{
Console.WriteLine(dt);
}
}
public class Seconds : IAsyncEnumerable<DateTime>
{
public class FooEnumerator : IAsyncEnumerator<DateTime>
{
public DateTime Current { get; set; }
public async ValueTask DisposeAsync() {}
public async ValueTask<bool> MoveNextAsync()
{
await Task.Delay(1000);
Current = DateTime.Now;
return true;
}
}
public IAsyncEnumerator<DateTime> GetAsyncEnumerator(CancellationToken cancellationToken = default)
=> new FooEnumerator();
}
Ответ №1:
Взгляните на асинхронный поток, который, по-видимому, является ближайшим эквивалентом.
Аналогичный пример может быть:
fun main() = runBlocking {
seconds().take(10).collect {
println(it)
}
}
fun seconds() = flow<Instant> {
while (true) {
delay(1000L)
emit(Instant.now())
}
}
Я использую kotlinx-coroutines-core
версию 1.3.9