Как мне написать метод асинхронного обновления для передачи двух параметров с помощью RestSharp?

#c# #unity3d #async-await #restsharp

#c# #unity3d #асинхронное ожидание #restsharp

Вопрос:

Я работаю над робототехническим приложением в Unity и хочу непрерывно передавать два параметра из своего приложения клиенту. Код, который я написал, заставляет приложение работать очень медленно (примерно 1 кадр в 5 секунд), и это должно быть проблемой с моими асинхронными запросами, но я не совсем уверен, в чем проблема:

  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);
   

}
 

Комментарии:

1. Я предполагаю, что происходит то, что Unity FixedUpdate вызывается не как обычный метод, а скорее системой обмена сообщениями -> он будет выполняться синхронно и ожидать запроса… Для вашей цели в целом это звучит так, как будто использование протокола TCP / UDP в выделенном потоке было бы лучше .. даже при использовании http / rest API выделенный поток, вероятно, был бы лучше для этого .. manualjog что это такое и как часто он действительно обновляется? В общем, похоже, что вы, возможно, достигли предела пропускной способности

2. Избегайте async void методов . Помимо этого, нам нужно посмотреть, как вызывается ваш метод.

3. manualjog — это строка, имеющая формат [axis1, axis2, axis3, axis4, axis5, axis6]. Я обновляю его через void Update с помощью логического значения, которое включает / выключает обновление в зависимости от того, собираюсь ли я использовать строку. @RichardDeeming FixedUpdate вызывается 50 раз в секунду. Я опустил логическое значение, которое включает / выключает обновление в зависимости от того, хочу ли я выполнять асинхронные вызовы, но когда он включен, метод вызывается автоматически 50 раз в секунду.

4. Если вы выполняете 50 вызовов в секунду, и каждый вызов занимает более 20 мс, вы создадите огромную очередь запросов. Использование вашей памяти будет неуклонно расти, а производительность значительно снизится. Вам нужно измерить ваши запросы, чтобы убедиться, что их выполнение не занимает слишком много времени.

5. Я просто решил это с помощью выделенной функции и цикла while. Большое спасибо вам обоим за указание на то, что проблема заключается в FixedUpdate! Вот рабочий код:

Ответ №1:

Я просто решил это с помощью выделенной функции и цикла while. Проблема, как указывалось, заключалась в FixedUpdate . Вот рабочий код:

 public async void SyncMechanicalUnits() {

    var client = new RestClient("http://localhost/rw/motionsystem/mechunits/ROB_1?action=mechunit-position");
    client.Timeout = -1;
    client.CookieContainer = login_cookie;

    while (solveron == true)
    {
        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);
    }