0

簡単に解決できるといいなと思っている問題があります。私は過去数日間答えを探しましたが、まだ運がありません。私がやろうとしているのは、接続されたクライアントを表す静的ディクショナリを作成することです。最終的な目標は、他のプレーヤーの場所など、接続されたすべてのクライアントデータを送信することです。とにかく、これまでに行ったことは、クライアントが最初に接続したときに、次のように静的ディクショナリに追加することです。

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ループが繰り返されることはありません。どんな助けでも大歓迎です、この問題は私を夢中にさせています!前もって感謝します。

-ジャリッド

4

1 に答える 1

0

それは単純なものであることがわかりました。私はクラスターサーバーを使用しており、この辞書をさまざまなプロセスから参照しようとしていました...当たり前です。アイデアをありがとう、スレッドセーフにしようとするよりも簡単だったことがわかりました。

于 2012-11-26T21:10:50.437 に答える