2016-08-08 29 views
0

Ich bin ein Anfänger Programmierer und habe Probleme zu verstehen, warum das nicht funktioniert. Ich habe eine "ConnectedClientList" Klasse:Problem mit dem Verständnis, warum eine Variable nicht aktualisiert wird

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); 
    } 
} 

Ich habe dies in einer anderen Klasse:

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

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

Und schließlich habe ich dies:

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"); 
     } 
    } 

Ich versuche, eine bauen Server mit dem Photon Server von Exitgame. Wenn ich zuerst den clientpeer erstelle und ihn dann zu den "ConnectedClientPeers" hinzufüge, habe ich sofort Debug-Informationen, dass die "ConnectedClientPeers" -Liste tatsächlich eine Zählung von 1 hat.

Der Thread, den ich laufen scheint, scheint zu sein Ich wiederhole die "SendUpdateEventToClients" nur gut, aber die Debug-Nachricht in dieser Funktion sagt immer, dass meine "ConnectedClientPeers" -Liste hat eine Zahl von 0.

Ich bin sicher, es ist wahrscheinlich etwas einfaches, das ich nicht bewusst bin, aber ich Ich hatte kein Glück, eine Lösung für die vergangenen paar Tage zu finden. Jede Hilfe oder Beratung wird sehr geschätzt. Vielen Dank!

-Jarryd

--Edit--

ich die Klasse aktualisiert, um die gesamte Klasse statisch zu machen, aber immer noch das gleiche Problem.

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); 
    } 
} 

Mein Debug-Log: 2016.08.08 14: 27: 21.771 [ThreadFiber-1] INFO [CharacterUpdateEventHandler] [55] [(null)] - Anzahl der angeschlossenen Client-Peers: 0

2016-08-08 14: 27: 23.428 [ThreadFiber-2] INFO [ZeichenUpdateEventHandler] [55] [(Null)] - # von verbundenen Peers: 0

2016-08-08 14: 27: 26.771 [ThreadFiber-1] INFO [CharacterUpdateEventHandler] [55] [(null)] - Anzahl der verbundenen Client-Peers: 0

2016-08-08 14: 27: 28.443 [ThreadFiber-2] INFO [CharacterUpdateEventHandler] [55] [(Null)] - Anzahl der verbundenen Client-Peers: 0

2016-08-08 14: 27: 31.774 [ThreadFiber-1] INFO [CharacterUpdateEventHandler] [55] [(null)] - Anzahl der verbundenen Client-Peers: 0

2016-08-08 14: 27: 33.453 [ThreadFiber-2] INFO [CharacterUpdateEventHandler] [55 ] [(null)] - Anzahl der verbundenen Client-Peers: 0

2016-08-08 14: 27: 36,787 [ThreadFiber-1] INFO [ZeichenUpdateEventHandler] [55] [(null)] - # des verbundenen Clients Kollegen: 0

2016-08-08 14: 27: 38,465 [ThreadFiber-2] INFO [CharacterUpdateEventHandler] [55] [(null)] - Anzahl der verbundenen Client-Peers: 0

+1

In der anderen Klasse, wo Sie AddClientPeerToConnectedList nennen sind Sie sicher, dass es die gleiche ConnectedClientList Objekt verweist, oder haben Sie neue ein anderes? – GreatJobBob

+0

Das ist, was ich dachte, dass das Problem auch gewesen sein könnte, weshalb ich am Ende die Variable statisch gemacht habe. Oder funktioniert das nicht statisch? Alles, was ich oben gepostet habe, habe ich nicht außen vor gelassen. Ich hatte anfangs die ganze Klasse als statisch, aber schien keinen Unterschied zu machen. – Jarryd

+0

Ich habe die ganze Klasse statisch gemacht, aber das scheint keinen Unterschied zu machen. Ich habe meinen ersten Post aktualisiert und die statische Klasse unten sowie einen kleinen Teil meines Debug-Logs hinzugefügt. Das Protokoll wird nur alle 5 Sekunden mit der gleichen Sache wiederholt. – Jarryd

Antwort

0

Nicht sicher, wie Sie in einem Kommentar Code eingeben, so viel von Ihrem Code scheint gut

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); 
        } 
       } 


      } 
     } 
    } 

Also das kommt noch hinzu, 3 Peers und zeigt die Zählung und zeigt, dass es in der tat 3

+0

Danke, dass du dir die Zeit genommen hast, GreatJobBob. Ich denke, Stichwort ist, denke, dass meine Logik in Ordnung ist. Es muss etwas Einfaches geben, das ich übersehe. Vielleicht, wie das Einfädeln von Photonen funktioniert, ist es vielleicht etwas anders als beim normalen Einfädeln? – Jarryd