Информация об изменениях

Сообщение Re[16]: Почему Эрланг от 12.06.2015 20:35

Изменено 12.06.2015 20:39 vdimas

Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Ты же про C#? Так там нет никакой поддержки вложенных короутинов, ни для yield (что очень печально)


для yield нет, конечно

НС>ни для async.


для await ты хотел сказать?

НС>Каждый async метод или итератор создает свой собственный независимый автомат.


Есно, речь шла о том, насколько автоматически итерируются вложенные автоматы. Для await — всё ОК, для yield — никакой автоматики, только ручками.

Пример для сравнения на async:
        private static Task t1 = new Task(() => {});
        private static Task t2 = new Task(() => {});

        static async Task Bar() {
            await t1;
        }

        static async Task Foo() {
            await Bar(); 
            await t2;
        }

        static void Main() {
            var task = Foo();
            ThreadPool.QueueUserWorkItem(dummy => t1.RunSynchronously());
            ThreadPool.QueueUserWorkItem(dummy => t2.RunSynchronously());
            task.Wait();
        }


и на yield:
        private static Task t1 = new Task(() => {});
        private static Task t2 = new Task(() => {});

        static IEnumerable<Task> Bar()
        {
            yield return Coroutine.Await(t1);
        }

        static IEnumerable<Task> Foo()
        {
            // ручная итерация вложенного метода
            foreach (var task in Coroutine.Await(Bar())) 
                yield return task;

            yield return Coroutine.Await(t2);
        }

        static void Main1()
        {
            var task = Coroutine.Wait(Foo());
            ThreadPool.QueueUserWorkItem(dummy => t1.RunSynchronously());
            ThreadPool.QueueUserWorkItem(dummy => t2.RunSynchronously());
            task.Wait();
        }

        // хелпер для IEnumerable-корутин
        static class Coroutine { ... }
Re[16]: Почему Эрланг
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Ты же про C#? Так там нет никакой поддержки вложенных короутинов, ни для yield (что очень печально)


для yield нет, конечно

НС>ни для async.


для await ты хотел сказать?

НС>Каждый async метод или итератор создает свой собственный независимый автомат.


Есно, речь шла о том, насколько автоматически итерируются вложенные автоматы. Для await — всё ОК, для yield — никакой автоматики, только ручками.

Пример для сравнения на async:
        private static Task t1 = new Task(() => {});
        private static Task t2 = new Task(() => {});

        static async Task Bar() {
            await t1;
        }

        static async Task Foo() {
            await Bar(); 
            await t2;
        }

        static void Main() {
            var task = Foo();
            ThreadPool.QueueUserWorkItem(dummy => t1.RunSynchronously());
            ThreadPool.QueueUserWorkItem(dummy => t2.RunSynchronously());
            task.Wait();
        }


и на yield:
        private static Task t1 = new Task(() => {});
        private static Task t2 = new Task(() => {});

        static IEnumerable<Task> Bar()
        {
            foreach (var task in Coroutine.Await(t1))
                yield return task;
        }

        static IEnumerable<Task> Foo()
        {
            // ручная итерация вложенного метода
            foreach (var task in Coroutine.Await(Bar())) 
                yield return task;

            foreach (var task in Coroutine.Await(t2))
                yield return task;
        }

        static void Main1()
        {
            var task = Coroutine.Wait(Foo());
            ThreadPool.QueueUserWorkItem(dummy => t1.RunSynchronously());
            ThreadPool.QueueUserWorkItem(dummy => t2.RunSynchronously());
            task.Wait();
        }

        // хелпер для IEnumerable-корутин
        static class Coroutine { ... }