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.

Crash de Redis en .Net 6

Tengo un error extraño en Redis en .Net 6. Cuando ejecuto el código de prueba aquí:

https://github.com/redis-developer/redis-graph-dotnet-basic-app/blob/main/Program.cs

Funciona perfectamente bien. En este caso, el código se está ejecutando en el archivo program.cs.

Cuando traslado ese código a una clase, con el fin de gestionar mejor la encapsulación y la complejidad, no funciona. Lo que hace es ejecutar el código y, cuando llega a la parte de await graph.QueryAsync, simplemente detiene el depurador. Muy extraño, en efecto.

Aquí está el código que estoy utilizando. ¿Algún consejo o sugerencia?

//Program.cs (Partes relevantes)

using RedisTest //PROGRAM //WRITE TO REDIS ENTERPRISE CLOUD ProcessLoadGraph processLoadGraph = new ProcessLoadGraph(); processLoadGraph.Controller(results);

//CLASE DE CONEXIÓN COMPARTIDA
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StackExchange.Redis;

namespace RedisTest
{
    public class RedisSharedConnection
    {
        public static ConnectionMultiplexer Connection
        {
            get
            {
                return lazyConnection.Value;
            }
        }

        private static Lazy<connectionmultiplexer> lazyConnection = new Lazy<connectionmultiplexer>(() =>
        {
            ConnectionMultiplexer connectionMultiplexer = ConnectionMultiplexer.Connect(ConfigData.dbConnectionString);
            return connectionMultiplexer;
        });
    }
}

//CLASE DE USO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NRedisGraph;

namespace RedisTest
{
    public class Process_LoadGraph
    {
        public async void Controller(List<result> results)
        {
            //Configuración
            var redisConnection = RedisSharedConnection.Connection;

            //var redisConnection = ConnectionMultiplexer.Connect(ConfigData.dbConnectionString);
            var db = redisConnection.GetDatabase(ConfigData.dbId);
            var graph = new RedisGraph(db);
            string graphName = ConfigData.graphName;

            //Transacción de prueba

            // Crear a Bob
            // SE CRASHEA AQUÍ
            var createBobResult = await graph.QueryAsync("pets", "MERGE(:human{name:'Bob',age:32})");
        }
    }
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con el comportamiento async/await en el método Controller de la clase Process_LoadGraph. Dado que el método Controller no está devolviendo nada, es posible que el programa se complete y termine antes de que se pueda finalizar la llamada a QueryAsync.

    Para resolver este problema, intenta cambiar la firma del método Controller para que devuelva una Task ya que es un método async. Además, asegúrate de usar await en la llamada a QueryAsync en el método de llamada. Aquí tienes un ejemplo del código actualizado:

    public class Process_LoadGraph
    {
        public async Task Controller(List<result> results)
        {
            //Configuración
            var redisConnection = RedisSharedConnection.Connection;
    
            //var redisConnection = ConnectionMultiplexer.Connect(ConfigData.dbConnectionString);
            var db = redisConnection.GetDatabase(ConfigData.dbId);
            var graph = new RedisGraph(db);
            string graphName = ConfigData.graphName;
    
            //Transacción de prueba
    
            // Crear a Bob
            // CRASHES HERE
            var createBobResult = await graph.QueryAsync("pets", "MERGE(:human{name:'Bob',age:32})");
        }
    }
    
    // Program.cs
    using RedisTest;
    
    // ESCRIBIR EN REDIS ENTERPRISE CLOUD
    var process_LoadGraph = new Process_LoadGraph();
    await process_LoadGraph.Controller(results);
    

    Al realizar estos cambios, el método de llamada esperará a que el método QueryAsync se complete antes de que el programa termine. Esperemos que esto resuelva el problema que estabas experimentando.

Comments are closed.