Pull to refresh

Comments 11

В Kotlin очень чистая реализация async/await, смотрится намного приятнее чем тот же TPL в C#. И для платформы Android это еще одна киллер-фича.

UFO just landed and posted this here
Я полагаю, что x2bool имел ввиду визуальную простоту — в шарпе все выглядит гораздо менее понятным с первого взгляда. Хотя пример в статье может быть слишком упрощенным.

В чем принципиальное отличие?


fun retrieveIssues() = async {
    println("Retrieving user")
    val user = await(githubApi.retrieveUser()) 
    println("$user retrieved")
    val repositories = await(githubApi.repositoriesFor(user))
    println("${repositories.size} repositories")
}

async void RetrieveIssues()
{
    Console.WriteLine("Retrieving user");
    var user = await githubApi.retrieveUser();
    Console.WriteLine($"{user} retrieved");
    var repositories = await githubApi.repositoriesFor(user);
    Console.WriteLine($"{repositories.size} repositories");
}
Я подумал про разницу этого:
[AsyncStateMachine(typeof(Program.<MethodTaskAsync>d__0))]
		public Task<int> MethodTaskAsync()
		{
			Program.<MethodTaskAsync>d__0 <MethodTaskAsync>d__ = new Program.<MethodTaskAsync>d__0();
			<MethodTaskAsync>d__.<>4__this = this;
			<MethodTaskAsync>d__.<>t__builder = AsyncTaskMethodBuilder<int>.Create();
			<MethodTask>d__.<>1__state = -1;
			AsyncTaskMethodBuilder<int> <>t__builder = <MethodTaskAsync>d__.<>t__builder;
			<>t__builder.Start<Program.<MethodTaskAsync>d__0>(ref <MethodTaskAsync>d__);
			return <MethodTaskAsync>d__.<>t__builder.Task;
		}

и
class <anonymous_for_state_machine> {
    // The current state of the machine
    int label = 0

    // Local variables for the coroutine
    User user = null
    List<Repository> repositories = null

    void resume (Object data) {
        if (label == 0) goto L0
        if (label == 1) goto L1
        if (label == 2) goto L2

        L0:
          println("Retrieving user")

          // Prepare for await call
          label = 1
          await(githubApi.retrieveUser(), this) 
             // 'this' is passed as a continuation
          return

        L1:
          user = (User) data
          println("$user retrieved")  

          label = 2
          await(githubApi.repositoriesFor(user), this)
          return 

        L2:
          repositories = (List<Repository>) data
          println("${repositories.size} repositories")     

          label = -1
          return
    }
}

Реализация не завязана на конкретный тип, такой, как Task. Ну, и то, что async/await это не специальные ключевые слова, а всего лишь функции.

Конкретный тип это как раз хорошо, потому что TPL появилось раньше и из async/await получился мощный инструмент, который базируется уже и так на мощном знакомом API, а не добавлено вообще сбоку непонятно к чему. При желании можно расширять поведение async/await и строить его на своих примитивах как раз благодаря тому, что он написан на том же .Net.

А ключевые слова это вкусовщина.
UFO just landed and posted this here
да и сейчас вроде ничего так
Очередное решение, которое не поддерживает жизненный цикл activity и fragment? И опять нужно будет делать костыли, как в rx, чтобы это хоть как-то работало?

А как оно должно знать о жизненном цикле, если это фича языка, а не интеграции с Android?

Sign up to leave a comment.

Articles