我有一个问题,我希望很容易解决。过去几天我一直在寻找答案,但还没有运气。我要做的是有一个静态字典表示连接的客户端,最终目标是发送所有连接的客户端数据,如其他播放器位置。无论如何,到目前为止我所做的是当客户端第一次连接时,我将它们添加到静态字典中,如下所示:
RegionServer.RegionClients.Add(UserId, this);
Log.DebugFormat("Added peer to region list");
foreach (var client in RegionServer.RegionClients)
{
Log.DebugFormat("Client id in list : {0}", client.Key);
}
我在调试语句中添加了以确保客户端确实被添加到列表中,而不是它。
然后在我的主文件中我有:
public override void InitBackgroundThreads()
{
ThreadPool.QueueUserWorkItem(SendUpdatesToAll);
}
public void SendUpdatesToAll(object threadContext)
{
Stopwatch timer = new Stopwatch();
timer.Start();
isRunning = true;
while (isRunning)
{
if (timer.Elapsed < TimeSpan.FromMilliseconds(100))
continue;
Update(timer.Elapsed);
timer.Restart();
}
}
public void Update(TimeSpan elapsed)
{
foreach (KeyValuePair<Guid, Unity3dPeer> peer in RegionClients)
{
Log.DebugFormat("Inside the foreach statement");
}
在我的调试日志中,我可以看到循环确实是循环的,但RegionClients字典值永远不会更新。 foreach循环从不迭代,因为字典中似乎没有客户端。任何帮助将不胜感激,这个问题一直让我抓狂!提前谢谢。
-Jarryd
答案 0 :(得分:0)
事实证明这很简单。我有一个集群服务器,我试图从不同的进程引用这个字典...呃。感谢您的想法,结果证明比尝试线程安全更简单。