同时为多个线程调用Join

我正在用 C# 为 Unity 编写一个脚本来读取来自多个来源的消息。我有一个函数ReadMessage,它接受一个端口字符串并返回一个字符串 ID 号。问题是,我有十几个不同的连接需要读取,并且消息在停止尝试并让代码继续之前有一个 10 毫秒的超时计时器。当我有十几个线程等待前一个线程完成加入时,这会导致帧速率降低。我的线程代码如下:


string threadOneString= null;

Thread ThreadOne;

//Repeat for 11 more threads

void Update () {

    ThreadOne = new Thread(

        () =>

        {

            threadOneString = ReadMessage(someClass.port);

        });

    ThreadOne.Start();

//Repeat for 11 more threads

}


void LateUpdate () {

    ThreadOne.Join();

    //Repeat for 11 more threads


    UpdateClass(threadOneString);

    //Repeat for 11 more threads


    UpdateTextDisplay(); //Just updates a Unity Text object

}

还有我的ReadMessage代码,以防万一。


private string ReadMessage(string port) //Change this name to ReadButtonPress

    {

        string fullMessage = "";

        someStruct parsedMessage;

        var timeout = new System.TimeSpan(0, 0, 0, 0, 10); // Less than 10 and it starts to miss most messages, ideally this would be a bit higher

        string connectionString = PROTOCOL + CONTROLLER_IP + ":" +  port;


        AsyncIO.ForceDotNet.Force();     

        using (var subSocket = new SubscriberSocket())

        {

            subSocket.Connect(connectionString);

            subSocket.Subscribe("");


            subSocket.TryReceiveFrameString(timeout, out fullMessage);

            UnityEngine.Debug.Log("Message: " + fullMessage);


            subSocket.Close();

        }

    // Some message parsing and checking...

    return parsedMessage.someString;

}

我想做的,但我不知道是否可能,是同时为每个线程调用 Joins,而不是调用一个,等待,然后调用下一个。线程不相互交互,所以我希望这是可能的。如果没有,我将不胜感激另一个解决方案或建议。


编辑:澄清正在发生的事情。当我只运行几个线程时,我的 FPS 为 65-70。当我运行所有 12 个线程时,我的 FPS 下降到 ~50 并且我有 60 FPS 的硬要求。


浮云间
浏览 219回答 3
3回答

慕仙森

感谢这里的一些反馈,我不再每次更新都创建一个套接字。相反,我创建了套接字,Start()然后从类中的公共函数中读取我需要的内容。不要做我所做的,并在每个 .bashrc 文件中重新创建完全相同的线程和套接字Update()。事后看来,这是一个非常糟糕的选择。

慕少森

定义 ManualResetEvent 并在获得结果时发出信号,您可以使用 WaitHandle.WaitAny 最多等待 64 个等待句柄

精慕HU

改用任务,并将它们放入列表中。var myTasks = new List<Task>();Task allUpdateTasks;...void Update () {&nbsp; &nbsp; myTasks.Add(&nbsp; &nbsp; &nbsp; &nbsp; Task.Factory.StartNew(() =>&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; threadOneString = ReadMessage(someClass.port);&nbsp; &nbsp; &nbsp; &nbsp; }));//Repeat for 11 more tasks// Create a single tasks that will hold all tasks above.allUpdateTasks = Task.WhenAll(myTasks);}void LateUpdate() {&nbsp; &nbsp; allUpdateTasks.Wait();...}
打开App,查看更多内容
随时随地看视频慕课网APP