es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Los datos entrantes llegarán de manera intermitente y estos datos entrantes deben ser devueltos de manera constante.

Mi propósito es que los datos entren en un ciclo mientras que estos datos entrantes sean retornados continuamente.

Coloqué el método AddValue en un ciclo while porque quiero agregar datos todo el tiempo y retornarlos todo el tiempo.

Mi problema es que llamo a GetValues en el Hub pero retorna null.

He intentado muchas variaciones.

public class StockCaller
{
    public static ConcurrentDictionary<string, stock=""> _stock = new ConcurrentDictionary<string, stock="">();

    public async Task AddValue()
    {
        while (true)
        {
            string[] symbols = new string[6] { "USD", "EUR", "ATLAS", "GARAN", "ISBNK", "AKBNK" };
            Random random = new Random();
            foreach (var item in symbols)
            {
                Stock stock = new Stock()
                {
                    symbol = item,
                    price = random.Next(100, 500),
                    percent = random.NextDouble(),
                };
                await AddValueAsync(stock);
            }
        }
    }

    public async Task AddValueAsync(Stock stock)
    {
        _stock.TryAdd(stock.symbol, stock);
        await Task.CompletedTask;
    }

    public Task<><stock>> GetValues()
    {
        return Task.FromResult(_stock.Values);
    }
}

Mi Hub es:

“`
public class MyHub : Hub
{
public readonly StockCaller _stock;

<pre><code>public MyHub(StockCaller stock)
{
_stock = stock;
}

public async Task SendRandomCharacter()
{
//TcpServer can be useable
while (true)
{
var result = await _stock.GetValues();
await Clients.All.SendAsync("receiveMessage", result);
}
}
</code></pre>

}
“`</string,></string,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En el código proporcionado, el método GetValues() está devolviendo directamente _stock.Values, que es un tipo de ConcurrentDictionary. Este tipo no se puede serializar ni enviar a través de la conexión de SignalR, por lo que necesita ser convertido en una colección serializable como una List.

    Para solucionar el problema de que el método GetValues() devuelva null, es necesario actualizar el método GetValues() en la clase StockCaller de la siguiente manera:

    public Task<><stock>> GetValues()
    {
        return Task.FromResult(_stock.Values.ToList());
    }
    

    Esto convertirá el ConcurrentDictionary en una List, que se puede serializar y enviar a través de la conexión de SignalR.

    Además, en el método SendRandomCharacter() en MyHub, el GetValues() debe ser esperado dentro del bucle de la siguiente manera:

    public async Task SendRandomCharacter()
    {
        while (true)
        { 
            var result = await _stock.GetValues();
            await Clients.All.SendAsync("receiveMessage", result);
            await Task.Delay(1000); // agregar un retraso para evitar transferencias de datos excesivas
        }      
    }
    

    Esto asegurará que siempre se recuperen los datos más recientes de _stock antes de enviarlos a los clientes. Además, se ha añadido un retraso para evitar transferencias de datos excesivas entre el servidor y los clientes.

    Con estos cambios, los clientes deberían recibir datos continuos del servidor sin problemas.

Comments are closed.