protected override Task WorkAction()
{
var now = DateTimeOffset.Now;
var requestTasks = new List<Task>();
var peerCount = this.localClient.ConnectedPeers.Count;
var targetChainLocal = this.coreDaemon.TargetChain;
if (peerCount == 0 || targetChainLocal == null)
return Task.CompletedTask;
var blockLocatorHashes = CalculateBlockLocatorHashes(targetChainLocal.Blocks);
// remove any stale requests from the peer's list of requests
this.headersRequestsByPeer.RemoveWhere(x => !x.Key.IsConnected || (now - x.Value) > STALE_REQUEST_TIME);
// loop through each connected peer
var requestCount = 0;
var connectedPeers = this.localClient.ConnectedPeers.SafeToList();
connectedPeers.Shuffle();
foreach (var peer in connectedPeers)
{
// determine if a new request can be made
if (this.headersRequestsByPeer.TryAdd(peer, now))
{
// send out the request for headers
requestTasks.Add(peer.Sender.SendGetHeaders(blockLocatorHashes, hashStop: UInt256.Zero));
// only send out a few header requests at a time
requestCount++;
if (requestCount >= 2)
break;
}
}
return Task.CompletedTask;
}