Re[4]: Как оптимизировать выполнения 10000 параллельных зада
От: LWhisper  
Дата: 05.08.16 12:54
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Используй AsyncAutoResetEvent


S>https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.threading.asyncautoresetevent.aspx

S>https://blogs.msdn.microsoft.com/pfxteam/2012/02/11/building-async-coordination-primitives-part-2-asyncautoresetevent/
S>https://github.com/StephenCleary/AsyncEx/wiki/AsyncAutoResetEvent

S>https://github.com/StephenCleary/AsyncEx


Вопрос, как перейти в 524 местах от старых ивентов к новым, мы опустим.
Но я пока не понимаю, как вышеописанные примеры способны исправить ситуацию? В одном запускается таска из пула повисает на локе. В другом запускается таска и виснет в while(true). В третьем запускается таска и у неё вызывается Wait(). Всё это приведёт к вышеописанной ситуации — исчерпании пула потоков и заморозки работы процесса. В одном из трёх случаев поток переходит в сигнальное состояние, но никаких APC при этом не вызывается, так что он просто висит в ожидании.


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


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