我有一个服务器设置为在端口上侦听客户端,然后如果它们找到一个,则将它们添加到客户端阵列,并从那里的另一个线程监听它们。
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] 删除。
我来说两句