Сообщение Re[16]: Почему Эрланг от 12.06.2015 20:35
Изменено 12.06.2015 20:39 vdimas
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Ты же про C#? Так там нет никакой поддержки вложенных короутинов, ни для yield (что очень печально)
для yield нет, конечно
НС>ни для async.
для await ты хотел сказать?
НС>Каждый async метод или итератор создает свой собственный независимый автомат.
Есно, речь шла о том, насколько автоматически итерируются вложенные автоматы. Для await — всё ОК, для yield — никакой автоматики, только ручками.
Пример для сравнения на async:
и на yield:
НС>Ты же про 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:
и на yield:
НС>Ты же про 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 { ... }