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.

¿Cómo escribo un método de actualización asincrónico para pasar dos parámetros utilizando RestSharp?

Estoy trabajando en una aplicación de robótica en Unity y quiero pasar continuamente dos parámetros desde mi aplicación a un cliente. El código que he escrito hace que la aplicación se ejecute extremadamente lenta (aproximadamente 1 cuadro cada 5 segundos) y debe ser un problema con mis solicitudes asincrónicas, pero no estoy seguro exactamente de dónde está el problema:

async void FixedUpdate()
{
    var client = new RestClient("http://localhost/rw/motionsystem/mechunits/ROB_1?action=mechunit-position");

    client.Timeout = -1;

    client.CookieContainer = login_cookie;

    var request = new RestRequest(Method.POST);

    request.AddHeader("Accept", "application/json");
    request.AddHeader("Content-Type", "application/x-www-form-urlencoded;v=2.0");

    request.AddParameter("rob_joint", manualjog);
    request.AddParameter("ext_joint", "[0,0,0,0,0,0]");

    var restResponse = await client.ExecuteTaskAsync(request);
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Analizando el Código

    El código proporcionado utiliza el método FixedUpdate con async dentro de Unity, el cual se llama una vez por frame. Dentro de este método, se instancia un RestClient para realizar una solicitud POST utilizando la librería RestSharp. La URL del punto de conexión para la solicitud a la API es http://localhost/rw/motionsystem/mechunits/ROB_1?action=mechunit-position`. Se pasan dos parámetros con la solicitud:rob_jointyext_joint`.

    El código utiliza await para realizar una solicitud asíncrona y obtener la respuesta en forma de un objeto restResponse.

    Encontrando el Problema

    El problema que está causando que la aplicación se ejecute extremadamente lenta podría estar relacionado con el parámetro de tipo string ext_joint que se pasa al servidor. Parece que ext_joint podría ser un objeto JSON serializado, pero se está pasando como una cadena de texto, lo cual puede hacer que la recolección de basura de Unity se ejecute con más frecuencia y, por lo tanto, ralentizar el rendimiento.

    Solución

    Para solucionar este problema, necesitamos serializar el objeto JSON a una cadena de texto antes de pasarlo como parámetro. A continuación se muestra un fragmento de código actualizado:

    async void FixedUpdate ()
    {
        var client = new RestClient("http://localhost/rw/motionsystem/mechunits/ROB_1?action=mechunit-position");
        client.Timeout = -1;
        client.CookieContainer = login_cookie;
    
        var request = new RestRequest(Method.POST);
    
        request.AddHeader("Accept", "application/json");
        request.AddHeader("Content-Type", "application/json");
    
        var extJointParams = new { joints = new[] { 0, 0, 0, 0, 0, 0 } };
        var extJointJson = JsonConvert.SerializeObject(extJointParams);
    
        request.AddParameter("rob_joint", manualjog);
        request.AddParameter("ext_joint", extJointJson);
    
        var restResponse = await client.ExecuteTaskAsync(request);
    }
    

    En el código actualizado, utilizamos la librería Newtonsoft.Json para serializar el parámetro ext_joint. Se crea y se serializa el objeto ext_joint utilizando el método JsonConvert.SerializeObject, luego se pasa como parámetro con el nombre ext_joint.

    Mediante el código anterior, podemos solucionar el problema de rendimiento y pasar continuamente los dos parámetros desde la aplicación al cliente.

Comments are closed.