Здравствуйте, 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 переводит поток в сигнальное состояние и тот выполняет другие задачи из пула?