静态字典内容不变

时间:2012-11-25 23:05:21

标签: c# dictionary thread-safety threadpool

我有一个问题,我希望很容易解决。过去几天我一直在寻找答案,但还没有运气。我要做的是有一个静态字典表示连接的客户端,最终目标是发送所有连接的客户端数据,如其他播放器位置。无论如何,到目前为止我所做的是当客户端第一次连接时,我将它们添加到静态字典中,如下所示:

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

1 个答案:

答案 0 :(得分:0)

事实证明这很简单。我有一个集群服务器,我试图从不同的进程引用这个字典...呃。感谢您的想法,结果证明比尝试线程安全更简单。