Changeset 14009 for branches/thasling/DistributedGA/DistributedGA.Core/Implementation/WcfPeerListManager.cs
- Timestamp:
- 07/06/16 16:47:47 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/thasling/DistributedGA/DistributedGA.Core/Implementation/WcfPeerListManager.cs
r13982 r14009 22 22 private IContactService client; 23 23 24 private IContactService heartbeatClient;24 private List<PeerInfo> cachedPeerList; 25 25 26 private double communicationRate; 26 27 28 private Random rand; 27 29 28 public void Init(PeerInfo source, string contactServerUrl ) {30 public void Init(PeerInfo source, string contactServerUrl, double communicationRate) { 29 31 serverString = contactServerUrl; 32 this.communicationRate = communicationRate; 30 33 myself = source; 31 32 //Init ChannelFactory and Clients 34 cachedPeerList = new List<PeerInfo>(); 35 rand = new Random(); 36 //Init ChannelFactory and Client 33 37 var binding = new NetTcpBinding(); 34 38 var endpoint = new EndpointAddress(serverString); 35 39 myChannelFactory = new ChannelFactory<IContactService>(binding, endpoint); 36 40 client = myChannelFactory.CreateChannel(); 37 heartbeatClient = myChannelFactory.CreateChannel();38 41 //Register Peer 39 client.RegisterPeer( source);42 client.RegisterPeer(myself); 40 43 //Start heartbeat timer 41 44 timer = new Timer(1000 * 20); //each 20 seconds 42 timer.Elapsed += SendHeartbeatToServer;45 timer.Elapsed += RefreshPeerList; 43 46 timer.Start(); 44 47 } 45 48 46 49 public List<PeerInfo> GetPeerList() { 47 try { 48 var allPeers = client.GetPeerList(myself); //maybe timout exception... 49 return allPeers; 50 } 51 catch { } //if maybe sending failed (because of connection lost, etc.): just ignore 52 return new List<PeerInfo>(); 50 return cachedPeerList; 53 51 } 54 52 … … 61 59 timer.Dispose(); 62 60 ((IClientChannel)client).Close(); 63 ((IClientChannel)heartbeatClient).Close();64 61 myChannelFactory.Close(); 65 client = null;66 62 myChannelFactory = null; 67 63 } 68 64 69 private void SendHeartbeatToServer(object sender, ElapsedEventArgs e) { 65 private List<PeerInfo> ChoosePeersForMessaging(ref List<PeerInfo> allPeers) { 66 Shuffle<PeerInfo>(allPeers); 67 int toTake = Convert.ToInt32(allPeers.Count * communicationRate) + 1; 68 if (allPeers.Count > 0 && toTake == 0) { 69 toTake = 1; 70 } 71 return allPeers.Take(toTake).ToList(); ; 72 } 73 74 private void Shuffle<T>(IList<T> list) { 75 int n = list.Count; 76 while (n > 1) { 77 n--; 78 int k = rand.Next(n + 1); 79 T value = list[k]; 80 list[k] = list[n]; 81 list[n] = value; 82 } 83 } 84 85 private void RefreshPeerList(object sender, ElapsedEventArgs e) { 70 86 lock (timerLock) { 71 87 try { 72 heartbeatClient.UpdateHeartbeat(myself); 88 var allPeers = client.GetPeerList(myself); 89 cachedPeerList = ChoosePeersForMessaging(ref allPeers); 73 90 } 74 91 catch { } //nothing to do
Note: See TracChangeset
for help on using the changeset viewer.