private Task <PeerAddress> PingBroadcast(int port) { var tcsPing = new TaskCompletionSource <PeerAddress>(); var bindings = _peer.ConnectionBean.Sender.ChannelClientConfiguration.BindingsOutgoing; int size = bindings.BroadcastAddresses.Count; var taskLateJoin = new TcsLateJoin <Task <Message.Message> >(size, 1); if (size > 0) { var taskChannelCreator = _peer.ConnectionBean.Reservation.CreateAsync(size, 0); Utils.Utils.AddReleaseListener(taskChannelCreator, tcsPing.Task); taskChannelCreator.ContinueWith(taskCc => { if (!taskCc.IsFaulted) { AddPingListener(tcsPing, taskLateJoin); for (int i = 0; i < size; i++) { var broadcastAddress = bindings.BroadcastAddresses[i]; var peerAddress = new PeerAddress(Number160.Zero, broadcastAddress, port, port); var taskValidBroadcastResponse = _peer.PingRpc.PingBroadcastUdpAsync(peerAddress, taskCc.Result, _connectionConfiguration); if (!taskLateJoin.Add(taskValidBroadcastResponse)) { break; } } } else { tcsPing.SetException(taskCc.TryGetException()); } }); } else { tcsPing.SetException(new TaskFailedException("No broadcast address found. Cannot ping nothing.")); } return(tcsPing.Task); }
private static void AddPingListener(TaskCompletionSource <PeerAddress> tcsPing, TcsLateJoin <Task <Message.Message> > tcsLateJoin) { // TODO works? // we have one successful reply tcsLateJoin.Task.ContinueWith(tlj => { if (!tlj.IsFaulted && tcsLateJoin.TasksDone().Count > 0) { var taskResponse = tcsLateJoin.TasksDone()[0]; tcsPing.SetResult(taskResponse.Result.Sender); } else { tcsPing.SetException(tlj.TryGetException()); } }); }
private static void AddPingListener(TaskCompletionSource<PeerAddress> tcsPing, TcsLateJoin<Task<Message.Message>> tcsLateJoin) { // TODO works? // we have one successful reply tcsLateJoin.Task.ContinueWith(tlj => { if (!tlj.IsFaulted && tcsLateJoin.TasksDone().Count > 0) { var taskResponse = tcsLateJoin.TasksDone()[0]; tcsPing.SetResult(taskResponse.Result.Sender); } else { tcsPing.SetException(tlj.TryGetException()); } }); }
private Task<PeerAddress> PingBroadcast(int port) { var tcsPing = new TaskCompletionSource<PeerAddress>(); var bindings = _peer.ConnectionBean.Sender.ChannelClientConfiguration.BindingsOutgoing; int size = bindings.BroadcastAddresses.Count; var taskLateJoin = new TcsLateJoin<Task<Message.Message>>(size, 1); if (size > 0) { var taskChannelCreator = _peer.ConnectionBean.Reservation.CreateAsync(size, 0); Utils.Utils.AddReleaseListener(taskChannelCreator, tcsPing.Task); taskChannelCreator.ContinueWith(taskCc => { if (!taskCc.IsFaulted) { AddPingListener(tcsPing, taskLateJoin); for (int i = 0; i < size; i++) { var broadcastAddress = bindings.BroadcastAddresses[i]; var peerAddress = new PeerAddress(Number160.Zero, broadcastAddress, port, port); var taskValidBroadcastResponse = _peer.PingRpc.PingBroadcastUdpAsync(peerAddress, taskCc.Result, _connectionConfiguration); if (!taskLateJoin.Add(taskValidBroadcastResponse)) { break; } } } else { tcsPing.SetException(taskCc.TryGetException()); } }); } else { tcsPing.SetException(new TaskFailedException("No broadcast address found. Cannot ping nothing.")); } return tcsPing.Task; }