Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

153
Vistas
La tarea de recepción asíncrona de WebSocket no tiene prioridad

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:

  • Simplemente ejecutando una función y await su resultado
  • Generación de algunos subprocesos de trabajo que repiten la recepción de mensajes a través de AsyncQueue o ConcurrentQueue
  • Uso de TaskFactory.StartNew con una variedad de indicadores, tanto en la función del ejecutor de websocket como en los subprocesos de trabajo
  • Crear un nuevo Thread y darle una prioridad más alta o más baja

Ninguno 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.

over 4 years ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda