线程不会关闭,不会';似乎没有达到变化的变量

本文关键字:变量 变化 不会 线程 | 更新日期: 2023-09-27 17:57:50

我正在开发一款多人游戏,使用lidgren库进行联网。

我当前的一个读取服务器发送的消息的功能出现问题。功能如下:

public class Client
{
    /* code omitted */
    public void ReadMessage()
    {   
        //Read Messages
        while (running)
        {
        Debug.Log("InREAD");
           //wClient is a NetClient (lidgren library)
        NetIncomingMessage msg;
        while ((msg = wClient.ReadMessage()) != null)
        {
            switch (msg.MessageType)
            {
                case NetIncomingMessageType.Data:
                    if (msg.ReadString().Contains("Position"))
                    {
                        Debug.Log("Hej");
                        /*string temp = msg.ReadString();
                    string[] Parts = temp.Split(" ");
                    int x = int.Parse(Parts [1]);
                    int y = int.Parse(Parts [2]);
                    int z = int.Parse(Parts [3]);*/

                        //set player position to xyz values below
                    } else if (msg.ReadString().Contains("Instantiate"))
                    {
                        Debug.Log("Instantiate");
                        /* string temp = msg.ReadString();
                        string[] Parts = temp.Split(" ");*/
                    }
                    break;
            }
        }
        }
    }
}

正如你所看到的,当bool运行为true时,会有一个while循环运行(是的,我在声明时将其设置为true)

现在,在我的GUI类中,用于连接的按钮是etc,我有一个对OnApplicationQuit的函数调用,它看起来像这样:

void OnApplicationQuit()
{
    client.running = false;
    client.Disconnect();
    Debug.Log(client.running);
    Debug.Log("Bye");
}

然而,运行的更改并没有到达线程(我相信线程是在变量的缓存版本上运行的?)。所以我的问题是,当程序关闭时,如何使while循环停止?(我试着在OnApplicationQuit()中的线程上调用.Abort()函数,但它也不起作用

此外,我知道通过网络发送字符串不是很有效,除非你需要(所以没有必要告诉我!)

线程不会关闭,不会';似乎没有达到变化的变量

只是猜测(因为我不知道库lidgren):难道你的线程不可能因为没有收到来自客户端的任何消息而被困在调用wClient.ReadMessage()中吗?如果wClient.ReadMessage()是阻塞调用,那么产生的行为将是您所描述的行为。

此外:即使调用Thread.Abort()也不起作用,因为线程处于睡眠状态(因为它正在等待来自网络连接的东西):一旦wClient.ReadMessage()返回,线程就会中止。在这里查看MSDN,它告诉"如果在托管线程执行非托管代码时对其调用Abort,则在线程返回到托管代码之前不会抛出ThreadAbortException",这正是假设ReadMessage()在某个时刻将执行系统调用以等待来自底层套接字的一些数据的情况。

您必须调用client.Shutdown()