2016-08-08 9 views
0

私は初心者のプログラマーで、なぜこれが機能していないのか理解できない。 私は "ConnectedClientList" クラスを持っている:なぜ変数が更新されていないのかを理解するのに苦労する

public class ConnectedClientList 
{ 
    static readonly object _lock = new object(); 
    public static IList<ClientPeer> ConnectedClientPeers; 

    static ConnectedClientList() 
    { 
     ConnectedClientPeers = new List<ClientPeer>(); 
    } 


    public static IList<ClientPeer> GetClientPeers() 
    { 
     lock (_lock) 
     { 
      return ConnectedClientPeers; 
     } 

    } 

    public static void AddClientPeerToConnectedList(ClientPeer client) 
    { 
     lock (_lock) 
     { 
      ConnectedClientPeers.Add(client); 
     }     
    } 

    public void RemoveClientPeerFromConnectedList(ClientPeer client) 
    { 
     ConnectedClientPeers.Remove(client); 
    } 
} 

私は別のクラスでは、この持っている:私は構築しようとしています

public CharacterUpdateEventHandler(ILogger logger) 
    { 
     Logger = logger; 
     IFiber testFiber = new ThreadFiber(); 
     testFiber.Start(); 
     testFiber.ScheduleOnInterval(SendUpdateEventToClients, 1000, 5000); 
    } 

    public void SendUpdateEventToClients() 
    { 
     if(ConnectedClientList.GetClientPeers() != null) 
      Logger.InfoFormat("# of connected client peers: {0}", ConnectedClientList.GetClientPeers().Count); 
     else 
     { 
      Logger.InfoFormat("ConnectedClientPeers is null"); 
     } 
    } 

ClientPeer clientPeer = new ClientPeer(request, Logger, _clientHandlerRegistry); 

ConnectedClientList.AddClientPeerToConnectedList(clientPeer); 
Logger.InfoFormat("Added clientpeer to list. Count is now: {0}", ConnectedClientList.ConnectedClientPeers.Count); 

をそして最終的に私はこれを持っていますサーバーはExitgameのPhoton Serverを使用しています。最初にクライアントピアを作成し、それを「ConnectedClientPeers」に追加すると、すぐに「ConnectedClientPeers」リストに実際に1のカウントがあるというデバッグ情報が表示されます。

実行中のスレッドは次のようです"SendUpdateEventToClients"をうまく繰り返すが、その関数のデバッグメッセージは常に "ConnectedClientPeers"リストのカウントが0であることを示している。

私は気付いていないだろうが、渡された数日間の解決策を見つける運がなかった助けやアドバイスをいただければ幸いです。ありがとう!

-Jarryd

--Edit--

私は、クラス全体を静的にするためにクラスを更新し、それでも同じ問題を抱えています。

public static class ConnectedClientList 
{ 
    static readonly object _lock = new object(); 
    public static readonly IList<ClientPeer> ConnectedClientPeers; 

    static ConnectedClientList() 
    { 
     ConnectedClientPeers = new List<ClientPeer>(); 
    } 


    public static IList<ClientPeer> GetClientPeers() 
    { 
     lock (_lock) 
     { 
      return ConnectedClientPeers; 
     } 

    } 

    public static void AddClientPeerToConnectedList(ClientPeer client) 
    { 
     lock (_lock) 
     { 
      ConnectedClientPeers.Add(client); 
     }     
    } 

    public static void RemoveClientPeerFromConnectedList(ClientPeer client) 
    { 
     ConnectedClientPeers.Remove(client); 
    } 
} 

マイデバッグ・ログ: 2016年8月8日14:27:21771 [ThreadFiber-1] INFO [CharacterUpdateEventHandler] [55] [(ヌル)] - 接続されたクライアントピアの#:0

2016-08-08 14:27:23,428 INFO [CharacterUpdateEventHandler] [55] [(null)] - 接続されたクライアントピア数:0

2016-08-08 14:27:26,771 [ThreadFiber-1] INFO [CharacterUpdateEventHandler] [55] [(null)] - 接続されたクライアントピア数:0

2016-08-08 14:27:28,443 [ThreadFiber-2] INFO [CharacterUpdateEventHandler] [55] [(null)] - 接続されたクライアントピア数:0

2016-08-08 14:27:31,774 [ThreadFiber-1] INFO [CharacterUpdateEventHandler] [55] [(null)] - 接続されているクライアントピア数:0

2016-08-08 14:27:33,453 [ThreadFiber-2] INFO [CharacterUpdateEventHandler] [55 ] [(null)] - 接続されたクライアントピア数:0

2016-08-08 14:27:36,787 [ThreadFiber-1] INFO [CharacterUpdateEventHandler] [55] [(null)] - 接続されたクライアントの数同僚:0

2016-08-08 14: 27:38,465 [ThreadFiber-2] INFO [CharacterUpdateEventHandler] [55] [(null)] - 接続されているクライアントピア数:0

+1

あなたがAddClientPeerToConnectedListを呼び出す他のクラスであるあなたはそれが同じConnectedClientListオブジェクトを参照している、または新しいなかったことを確信していることを示しています別のものをアップする? – GreatJobBob

+0

これは、私が問題が起こっている可能性があると考えているため、変数を静的にしてしまった理由です。それとも静的な仕組みではないのですか?私が上に投稿したすべてのもの、私は何も残さなかった。私は当初クラス全体を静的なものとして扱いましたが、違いは見られませんでした。 – Jarryd

+0

私はクラス全体を静的にしましたが、違いはありません。私は私の最初の投稿を更新し、私のデバッグログの小さな部分だけでなく、下部に静的なクラスを追加しました。ログは同じことで5秒ごとに繰り返されます。 – Jarryd

答えて

0

コメントにコードを投稿する方法がわからないので、コードの多くはうまく表示されます

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 

    namespace ConsoleApplication6 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       ClientPeer clientPeer = new ClientPeer(); 
       clientPeer.MyProperty = 5; 
       ConnectedClientList.AddClientPeerToConnectedList(clientPeer); 
       Console.WriteLine(ConnectedClientList.ConnectedClientPeers.Count.ToString()); 

       ConnectedClientList.AddClientPeerToConnectedList(clientPeer); 
       Console.WriteLine(ConnectedClientList.ConnectedClientPeers.Count.ToString()); 


       clientPeer = new ClientPeer(); 
       ConnectedClientList.AddClientPeerToConnectedList(clientPeer); 
       Console.WriteLine(ConnectedClientList.ConnectedClientPeers.Count.ToString()); 

      } 

      public class ClientPeer 
      { 

       public int MyProperty { get; set; } 

      } 

      public static class ConnectedClientList 
      { 
       static readonly object _lock = new object(); 
       public static IList<ClientPeer> ConnectedClientPeers; 

       static ConnectedClientList() 
       { 
        ConnectedClientPeers = new List<ClientPeer>(); 
       } 


       public static IList<ClientPeer> GetClientPeers() 
       { 
        lock (_lock) 
        { 
         return ConnectedClientPeers; 
        } 

       } 

       public static void AddClientPeerToConnectedList(ClientPeer client) 
       { 
        lock (_lock) 
        { 
         ConnectedClientPeers.Add(client); 
        } 
       } 


      } 
     } 
    } 

だから、これはわずか3つのピアを追加し、カウント数が表示され、そこに実際に3

+0

時間を取ってくれてありがとうGreatJobBob。私は、キーワードは、私の論理は大丈夫だと思うと思います。私は見落としている単純なものがなければならない。おそらく光子のスレッディングがどのように機能するのでしょうか、それは通常のスレッディングとは少し違いますか? – Jarryd

関連する問題