【问题标题】:How do I write an async Update method to pass two parameters using RestSharp?如何编写异步更新方法以使用 RestSharp 传递两个参数?
【发布时间】:2021-12-08 15:29:10
【问题描述】:

我正在 Unity 上开发一个机器人应用程序,我想将两个参数从我的应用程序连续传递给客户端。我编写的代码导致应用程序运行非常缓慢(大约每 5 秒 1 帧),这一定是我的异步请求的问题,但我不确定问题出在哪里:

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

}

【问题讨论】:

  • 我猜发生的情况是 Unity FixedUpdate 不像普通方法那样被调用,而是由消息传递系统调用 -> 它将同步执行并等待请求......为了您的一般目的听起来在专用线程中使用 TCP / UDP 协议会更好.. 即使坚持使用 http/rest API,专用线程也可能会更好.. manualjog 它是什么以及它多久真的更新了吗?一般来说,您可能会遇到带宽限制
  • Avoid async void methods。除此之外,我们还需要看看你的方法是如何被调用的。
  • manualjog 是一个字符串,格式为 [axis1,axis2,axis3,axis4,axis5,axis6]。我通过 void Update 使用布尔值对其进行更新,该布尔值根据我是否要使用该字符串来打开/关闭更新。 @RichardDeeming FixedUpdate 每秒调用 50 次。我省略了一个布尔值,它根据我是否要进行异步调用来打开/关闭更新,但是当它开启时,该方法每秒自动调用 50 次。
  • 如果您每秒进行 50 次调用,并且每次调用的完成时间超过 20 毫秒,那么您将建立一个庞大的请求队列。您的内存使用量将稳步攀升,而您的性能将显着下降。您需要衡量您的请求,以确保它们不会花费太长时间来完成。
  • 我刚刚用一个专用函数和一个while循环解决了这个问题。非常感谢你们指出问题出在 FixedUpdate 中!这是工作代码:

标签: c# unity3d async-await restsharp


【解决方案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);
    }

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多