线程给出了错误的论点

鲁比克斯·杜德

我有一个服务器设置为在端口上侦听客户端,然后如果它们找到一个,则将它们添加到客户端阵列,并从那里的另一个线程监听它们。

Console.Write("Max Players: ");
maxPlayers = Int32.Parse(Console.ReadLine());
clients = new TcpClient[maxPlayers];
playerCount = 0;

formatter = new BinaryFormatter();
server = new TcpListener(IPAddress.Parse("192.168.1.33"), 7777);
server.Start();

while (true)
{
    if (server.Pending() && playerCount < maxPlayers)
    {
        Console.WriteLine("Found client");
        clients[playerCount] = server.AcceptTcpClient(); // Get client connection
        //When one player joins, this should start a thread with an a playerCount of 0
        Thread t = new Thread(() => ListenClient(playerCount));
        t.Start();
        playerCount++;
    }
}

public static void ListenClient(int index)
{
    while (true)
    {
        NetworkStream stream = clients[index].GetStream();
        object obj = formatter.Deserialize(stream);

        if (obj != null)
        {
            Console.WriteLine(obj);
        }
    }
}

但是,当一个玩家加入时,由于某种原因,线程将被调用并传递参数1,而不是0。这是什么问题?

谢伊__

好吧,这就是lambda的工作方式。尝试以下方法:

while (true)
{
    if (server.Pending() && playerCount < maxPlayers)
    {
        Console.WriteLine("Found client");
        clients[playerCount] = server.AcceptTcpClient(); // Get client connection
        //When one player joins, this should start a thread with an a playerCount of 0
        int currentPlayersCount = playerCount;
        Thread t = new Thread(() => ListenClient(currentPlayersCount));
        t.Start();
        playerCount++;
    }
}

编辑:

由于这被认为是答案,因此应该提到,DavidG和Andrey在下面的帖子中提供了有关闭包的其他重要信息,应该阅读它们以获得完整的图像。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章