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

Сообщение Re[5]: Как оптимизировать выполнения 10000 параллельных зада от 05.08.2016 13:21

Изменено 05.08.2016 13:28 Serginio1

Здравствуйте, LWhisper, Вы писали:


LW>
LW>        /// <summary>
LW>        /// Asynchronously waits for this event to be set.
LW>        /// </summary>
LW>        public Task WaitAsync()
LW>        {
LW>            lock (_sync)
LW>            {
LW>                var ret = _tcs.Task;
LW>                //Enlightenment.Trace.AsyncManualResetEvent_Wait(this, ret);
LW>                return ret;
LW>            }
LW>        }
LW>


LW>Возможно, я чего-то не понимаю? Повисший на локе await переводит поток в сигнальное состояние и тот выполняет другие задачи из пула?


В асинхронном программировании все основано на событии и разбиении метода на участки которые выполняются по сигналу выполнения задачи используя конечный автомат.
Задача повисшая на локе await завершает свою работу в потоке и продолжит работу когда задача на await завершится. За этим следит планировщик.
У тебя будет куча задач висящих на await , но количество используемых потоков будет равно реально работающим.
Re[5]: Как оптимизировать выполнения 10000 параллельных зада
Здравствуйте, LWhisper, Вы писали:


LW>
LW>        /// <summary>
LW>        /// Asynchronously waits for this event to be set.
LW>        /// </summary>
LW>        public Task WaitAsync()
LW>        {
LW>            lock (_sync)
LW>            {
LW>                var ret = _tcs.Task;
LW>                //Enlightenment.Trace.AsyncManualResetEvent_Wait(this, ret);
LW>                return ret;
LW>            }
LW>        }
LW>


LW>Возможно, я чего-то не понимаю? Повисший на локе await переводит поток в сигнальное состояние и тот выполняет другие задачи из пула?


В асинхронном программировании все основано на событии и разбиении метода на участки которые выполняются по сигналу выполнения задачи используя конечный автомат.
Задача повисшая на локе await завершает свою работу в потоке и продолжит работу когда задача на await завершится. За этим следит планировщик.
У тебя будет куча задач висящих на await , но количество используемых потоков будет равно реально работающим.

Работа задач это облегченные fiber. Еще в энумераторах через yield MS пошла на сохранение состояние и продолжение по вызову.
Async await аналогично yield, только MoveNext() возникает по окончании задачи ждущей на await