Estoy usando Fleck (un servidor websocket de C#) para un proyecto que estoy haciendo y me encontré con un problema.
Generalmente, Fleck recibe datos de un socket web usando esta función:
public Task<int> Receive(byte[] buffer, Action<int> callback, Action<Exception> error, int offset) { try { Func<AsyncCallback, object, IAsyncResult> begin = (cb, s) => _stream.BeginRead(buffer, offset, buffer.Length, cb, s); Task<int> task = Task.Factory.FromAsync<int>(begin, _stream.EndRead, null); task.ContinueWith(t => callback(t.Result), TaskContinuationOptions.NotOnFaulted) .ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); task.ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); return task; } catch (Exception e) { error(e); return null; } } Para cada mensaje que recibe el websocket, ejecuto una función de trabajador asíncrono que usa algo de CPU.
El problema es que, por alguna razón, cada vez que tengo varias funciones de trabajo en ejecución, esta función Recibir recibe entradas a un ritmo mucho más lento de lo que se envían (a través de Chrome o Firefox).
Estoy buscando una manera de darle prioridad sobre las funciones de trabajo, lo que significa que cada vez que se recibe un mensaje, quiero ejecutar otra función que luego pondrá en cola una nueva función de trabajo.
El motivo es que el websocket se puede cerrar o recibir un mensaje de cancelación, pero el mensaje de cancelación no se lee hasta que casi todos los mensajes se han procesado (decenas de minutos después), lo que hace que no haga casi nada.
He intentado varias formas diferentes de poner en cola las funciones de los trabajadores, que incluyen:
await su resultadoAsyncQueue o ConcurrentQueueTaskFactory.StartNew con una variedad de indicadores, tanto en la función del ejecutor de websocket como en los subprocesos de trabajoThread y darle una prioridad más alta o más bajaNinguno de estos métodos resolvió el problema.
Creo que estoy malinterpretando algo básico sobre cómo funciona el programador de tareas de C#, pero simplemente no puedo resolverlo.