Hi Sébastien,
you are using a busy loop and therefore blocking a whole core. See
private void PageHandler(OpenSource.UPnP.UPnPDevice sender, OpenSource.UPnP.HTTPMessage msg, OpenSource.UPnP.HTTPSession WebSession, string VirtualDir) {
// ...
while (!sessionMp3Streams.TryRemove(s.SessionID, out value)) ;;
A quick fix is to use wait handlers. Change the loop to
while (!sessionMp3Streams.TryRemove(s.SessionID, out value))
ewh.WaitOne();
and declare
private static EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset);
After writing to sessionMp3Streams use ewh.Set(); E.g.
PipeStream stream = sessionMp3Streams.GetOrAdd(WebSession.SessionID, new PipeStream());
ewh.Set();
and
Parallel.ForEach<PipeStream>(sessionMp3Streams.Values, (p, s, l) =>
{
p.Write(bufferMp3, 0, bytesRead);
ewh.Set();
});
Now the usage is at most 3% instead of 100%…